黑马程序员技术交流社区

标题: 多线程notify和notifyAll [打印本页]

作者: zclove898    时间: 2011-12-19 17:14
标题: 多线程notify和notifyAll
本帖最后由 zclove898 于 2011-12-19 17:27 编辑

在多线程中,notify和notifyAll的区别,在什么情况下使用
作者: 余松霖    时间: 2011-12-19 17:16
本帖最后由 余松霖 于 2011-12-19 17:22 编辑

notify唤醒一个等待线程.这个线程是随机不能确定的.
notifyAll唤醒所有等待线程.
  一般有为了安全性,在多线程时,绝对多数时候应该使用notifiAll().防止死锁.
作者: 刘旭    时间: 2011-12-19 17:21
notify是唤醒线程池中排在队列前面的线程,notifyAll唤醒所有等待线程
作者: zclove898    时间: 2011-12-19 17:25
余松霖 发表于 2011-12-19 17:16
notify唤醒一个等待线程.这个线程是随机不能确定的.
notifyAll唤醒所有等待线程.
  一般有为了安全性,在多 ...

哦,有点感觉了,谢谢了
作者: t_mac    时间: 2011-12-19 17:25
本帖最后由 t_mac 于 2011-12-19 17:27 编辑

notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。
notifyAll则是唤醒所有等待的线程,但是只有获得锁的那个线程才有执行的机会。
为什么要用notifAll呢?因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待,也就是通常说的“死锁”。
JDK1.5 中提供了多线程升级解决方案。
将同步Synchronized替换成现实Lock操作。
将Object中的wait,notify notifyAll,替换了Condition对象。
LZ可以去了解一下,现在一般都用这个。

作者: zclove898    时间: 2011-12-19 17:26
刘旭 发表于 2011-12-19 17:21
notify是唤醒线程池中排在队列前面的线程,notifyAll唤醒所有等待线程

谢谢了!!!!!
作者: zclove898    时间: 2011-12-19 17:27
t_mac 发表于 2011-12-19 17:25
notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。直 ...

恩好的,谢谢了
作者: 黑马巩伟伟    时间: 2011-12-19 17:29
        notify和notifyAll都是把某个对象上休息区内的线程
唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll
则唤醒这个对象上的休息室中所有的线程.一般有为了安全
性,我们在绝对多数时候应该使用notifiAll(),除非你明确知道
只唤醒其中的一个线程.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2