Java - notify()vs notifyAll() - 可能死锁?

时间:2010-09-27 20:45:23

标签: java concurrency

是否存在notify()可导致死锁的情况,但notifyAll() - 从不?

例如,在多个锁的情况下。 notify()仅通知一个线程运行,它检查对某个对象的锁定并再次等待,但另一个线程可以解锁该对象。如果使用notifyAll(),将通知所有线程运行,其中一个线程将确保解锁该对象。

1 个答案:

答案 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