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(); //唤醒一个等待的线程
}
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,运行结果:
扩展:
等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。
锁池:如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池。
sleep()和wait()方法与对象锁、锁池、等待池
http://blog.csdn.net/u014561933/article/details/58639411

Notify与notifyall的区别相关推荐

  1. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  2. notify 和 notifyAll的区别

    6.notify 和 notifyAll的区别 notify方法只唤醒一个等待(对象的)线程并使该线程开始执行.所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统 ...

  3. notify()和notifyAll()的区别

    1.notify()只能唤醒一个wait()线程,然而notifyAll()可以唤醒多个wait()线程: 2.两个都必须在synchronized中使用,过程不释放锁: 3.当每个线程都有特定锁的时 ...

  4. java notify什么意思_Java notify和notifyAll的区别和相同

    经常在往上逛,关于在java中notify和notifyAll,经常有人有以下的说法: notify只会通知一个在等待的对象,而notifyAll会通知所有在等待的对象,并且所有对象都会继续运行 并且 ...

  5. Java中notify() 和 notifyAll()的区别

    等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁. 锁池:只有获取了对象的锁,线程才能执行对象的 sync ...

  6. notify和notifyAll的区别,notify死锁问题

    具体讲解参照博客区别 下面补充一个例子,来说明,使用notify会产生死锁,但是使用notifyAll不会. 原题为lleetcode 1195 大体意思是:四个线程,调用同一个对象的四个不同方法,然 ...

  7. Java多线程——notify()与notifyAll()的区别

    notify(): 唤醒在此对象监视器上等待的单个线程.如果所有线程都在此对象上等待,则会选择唤醒其中一个线程.选择是任意性的,并在对实现做出决定时发生.线程通过调用其中一个 wait 方法,在对象的 ...

  8. Java并发编程—notify和notifyAll有什么区别?

    原文作者:知乎用户 原文地址:https://www.zhihu.com/question/37601861/answer/145545371 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  9. java中的notify和notifyAll有什么区别?

    作者:知乎用户 链接:https://www.zhihu.com/question/37601861/answer/145545371 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

最新文章

  1. L1-003 个位数统计
  2. c++Cocktail Selection Sort鸡尾酒选择排序的实现算法(附完整源码)
  3. 深刻理解数据库外键含义
  4. python长沙_长沙python
  5. 基于matlab模糊pid控制系统,基于MATLAB的模糊自适应PID控制器的设计
  6. Android库和项目收集-图片
  7. 防止javascript脚本读取cookie信息
  8. 2022-2028年中国产学研合作行业深度调查与战略咨询报告
  9. 计算机工程科学计算与仿真,BGPLUS实地科研 |中科院|计算机科学、计算机工程:计算机算法与数值建模实训...
  10. 关于《那些年啊,那些事——一个程序员的奋斗史》的更新
  11. 2022煤炭生产经营单位(安全生产管理人员)判断题及在线模拟考试
  12. 用Meta标签代码让360双核浏览器默认极速模式
  13. 达梦数据库(DM)——命令方式开启达梦数据库本地归档的具体方法
  14. 如何在Unity上开发Nintendo(任天堂)Switch平台游戏时让游戏patch包大小尽量小
  15. Linux CentOS 中安装 Tomcat(四)
  16. 计算机硬件和工作原理,计算机硬件及基本工作原理ppt课件.ppt
  17. 常用的清除浮动的方法
  18. java 使用itextpdf工具实现HTML转PDF文件
  19. miix5 u盘安装linux,联想Miix510 U盘装系统xp教程
  20. vue-vueadmin记录

热门文章

  1. 网络安全前景怎么样?怎么自学?看这一篇就够了
  2. 浏览器打印 之 window.print() 设置打印样式和内容
  3. 肢体残计算机技术培训学校,浅议如何消除肢体残疾学生的心理障碍
  4. qt计算机析构函数,QT中的new与析构函数
  5. *** missing separator. Stop.
  6. WIN10UI—实现思路分享及代码
  7. matlab hist函数的用法
  8. Ubuntu下Zotero及Docear的安装、插件配置、联合使用
  9. easyUI默认图标的使用
  10. anaconda配置python环境变量_Anaconda的安装及其环境变量的配置详解