notifyone和notifyall区别_notify被动形式

notifyone和notifyall区别_notify被动形式Notify与notifyall的区别notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Notify与notifyall的区别
notifyAll
使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成
等待该对象上的锁
,一旦该对象被解锁,他们就会去竞争。
 notify
则文明得多他只是
选择一个wait状态线程进行通知,并使它获得该对象上的锁
,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
1.两个方法都是Object对象用于通知处在等待该对象的线程的方法。
2.notify唤醒一个等待的线程;notifyAll唤醒所有等待的线程。
3.扩展在后面:
锁池:某个线程中调用了对象锁的
notify()方法
之后,争夺执行权,进入锁池。
等待池:某个线程中调用了对象锁的
wait()方法
之后,该线程主动放弃执行权并等待唤醒,进入待待池。
演示代码:(借鉴一篇博客中看到的代码)
package com.Map.test;

import java.util.concurrent.TimeUnit;

public class notifyOrNotifyAll {
public static void main(String[] args) {
Object co = new Object();
for (int i = 0; i < 5; i++) {
//用循环启动五个线程0-4
MyThread t = new MyThread(“Thread
” + i,co);
t.start();
}
try {
TimeUnit.SECONDS.sleep(2);
System.out.println(“—–Main Thread notify—–
“);
synchronized(co){

co.notify();
//唤醒一个等待的线程
}
notifyone和notifyall区别_notify被动形式
TimeUnit.SECONDS.sleep(2);
System.out.println(“Main Thread is end
.”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

static class MyThread extends Thread {
private String name;
private Object co;

public MyThread(String name, Object o) {
this.name = name;
this.co = o;
}

@Override
public void run() {
System.out.println(name + ” is waiting
.”);
try {
synchronized (co) {
co.wait();
}
System.out.println(name + “ has been notified
.”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
将其中的那个notify换成
notifyAll
运行结果
notifyone和notifyall区别_notify被动形式

扩展:
等待池
:
假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中
锁池

如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。
sleep()和wait()方法与对象锁、锁池、等待池
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196194.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vs2019中scanf返回值被忽略_vs2017scanf

    vs2019中scanf返回值被忽略_vs2017scanf一、问题再现如下是笔者在学习数据结构中的二叉树时遇到的问题:报错警告:返回值被忽略:”scanf”。二、问题分析百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。微软公司觉得其不安全,所以在VS编译器中提供了scanf_s()函数,这是VS编译器特有的函数。强制用户提升安全性,如果想要在VS中使用scanf()函数,则可以通过一下4中方法解决。三、解决方案1、把scanf改成:scanf_s把所有的scanf()改

    2025年6月8日
    4
  • 手机号归属地数据库;根据手机号查找对应的归属地;[通俗易懂]

    手机号归属地数据库;根据手机号查找对应的归属地;[通俗易懂]我在网上找到了一份手机号+对应归属地的数据库文档。链接:https://pan.baidu.com/s/1MQtDkw3sowNmdSeoVJUbEA密码:tp1o链接:https://pan.baidu.com/s/1pzh_FqXOP_6Ta103K5Cmyw密码:9j5r如有需要,先点赞、关注,再下载。…

    2022年7月22日
    13
  • iocp详解_iocp是异步io吗

    iocp详解_iocp是异步io吗#include”SOCKET.h”#includeDWORDWINAPIThreadProc(LPVOIDpvParam);#definePORT8080#defineLISTEN_QUEUE200//AcceptEx和GetAcceptExSockaddrs的函数指针,用于调用这两个扩展函数LPFN_ACCEPTEX       

    2022年9月29日
    3
  • 量化投资学习——多因子权重组合优化问题

    量化投资学习——多因子权重组合优化问题关于多因子权重组合优化问题,这里首先整理若干链接供大家参考:pythonoptimize_Python与量化多因子——因子权重优化文章中从常见的因子合成方法,如静态权重,动态权重出发,拓展到了动态权重,介绍了最大化ICIR的缺点,介绍了cvxpy等工具包,包括常见的一些约束问题,文章还举了若干例子,比较好…

    2022年9月28日
    6
  • PNP和NPN的区别_pnp和npn的二极管图

    PNP和NPN的区别_pnp和npn的二极管图为什么PNP三极管集电极(C)和发射极(E)反着接,却可以当开关使用?理解NPN和PNP两种类型的三极管原理及电流方向就会明白为什么PNP三极管的集电极和发射极反着接当开关使用。NPN和PNP三极

    2022年8月5日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号