是否存在notify()
可导致死锁的情况,但notifyAll()
- 从不?
例如,在多个锁的情况下。 notify()
仅通知一个线程运行,它检查对某个对象的锁定并再次等待,但另一个线程可以解锁该对象。如果使用notifyAll()
,将通知所有线程运行,其中一个线程将确保解锁该对象。
答案 0 :(得分:6)
是。想象一下,您使用synchronize, wait, and notify
实现了Producer - Consumer问题。 (编辑)其中2个生产者和2个消费者都在同一个对象监视器上等待(结束编辑)。生产者在此实现中调用notify
。现在假设您有两个运行Producer代码路径的Threads。 Producer1可能会调用notify
并唤醒Producer2。 Producer2意识到他无法做任何工作,因此无法拨打notify
。现在你陷入僵局。
(编辑)如果notifyAll
被调用,那么除了Producer2之外,Consumer1和Consumer2都会被唤醒。其中一个消费者会消耗数据,然后调用notifyAll
来唤醒至少一个生产者,从而允许非常破碎的实现成功地跛行。
以下是基于我的情景的参考问题: My Produce Consumer Hangs