关于notify和notifyAll的讨论,很有意义,记录下来,写了些自己的心得:对notify notifyAll有疑问的可以参考下这篇讨论http://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again
很多文章建议使用notifyAll比notfiy安全,但这里的几个回答详细分析了两个方法的适用场景。notifyAll虽然可以唤醒所有处于WAITING(不消耗CPU)的状态的线程,但被唤醒的线程如果依次被执行后马上去争抢锁,就会有大量的线程进入到BLOCKED状态,增加CPU的开销。此时用notify反而更好。第5个解释我觉得比较到位:
1)notify适用于所有等待的线程都是对等的(或者说唤醒顺序对其执行任务无影响),或者适用于本来就只有一个等待线程的场景。不过文中的例子觉得不妥,一般线程池都是设计成可并行执行的,如果只是串行执行就没意义了。应该如第7个解释中说的,适用于资源池,即任意数量的消费者都要从池中获取资源,但一次只能有一个获取到这个资源。可以将生产者消费者的例子修改下,假设消费者和生产者是两个对象,而消费者的get方法里有同步块(代码如下):
public Object get() {
synchronized(lock){//lock可以是所有消费者在执行get时要获取的公共锁
while (buf.size()==0) {
wait();
}
Object o = buf.remove(0);
notify();
return o;
}
}
则这样用notify就比较合适,只唤醒其它等待的消费者线程中的一个,此处如果改成notfiyAll的话就让其它线程被唤醒后立刻进入BLOCKED状态,增加了CPU的开销。
2)notfiyAll适用于等待的线程有不同的目标,可以并行执行的场景。这样才不至于使所有线程被唤醒后又进入到BLOCKED状态。
分享到:
相关推荐
Java 同步方式 wait和notify/notifyall
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
本文主要介绍Java notify和notifyAll的知识,这里整理详细的资料来说明notify 和NotifAll的区别,有需要的小伙伴可以参考下
本篇文章对Java中多线程notify与notifyall的区别进行了详细的分析介绍。需要的朋友参考下
主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下
源码—Java多线程5—死锁和wait notify notifyAll
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait()、notify()和notifyAll()方法1---马克-to-win java视频
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
Java多线程同步(wait()notify()notifyAll())[文].pdf
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
wait和notify讲解
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
3(深入理解Wait、Notify和Wait与sleep区别).rar
很多朋友对java中的notyfy()和notifyAll()的本质区别不了解,今天小编抽空给大家整理一篇教程关于Java中的notyfy()和notifyAll()的本质区别,需要的朋友参考下吧