Java-notify()与notifyAll()-可能的死锁?

Java-notify()与notifyAll()-可能的死锁?,java,concurrency,Java,Concurrency,是否有任何情况下notify()会导致死锁,但notifyAll()-永远不会 例如,在多个锁的情况下notify()只通知一个线程运行,该线程检查某个对象的锁并再次等待,尽管另一个线程可以解锁该对象。如果使用notifyAll(),所有线程都将被通知运行,其中一个线程将确保解锁该对象。是。假设您使用同步、等待和通知实现生产者-消费者问题(编辑),其中两个生产者和两个消费者都在同一个对象监视器上等待(结束编辑)。生产者在此实现中调用notify。现在假设有两个线程运行生产者的代码路径。Produ

是否有任何情况下
notify()
会导致死锁,但
notifyAll()
-永远不会


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

是。假设您使用
同步、等待和通知
实现生产者-消费者问题(编辑),其中两个生产者和两个消费者都在同一个对象监视器上等待(结束编辑)。生产者在此实现中调用
notify
。现在假设有两个线程运行生产者的代码路径。Producer1可能会调用
notify
并唤醒Producer2。Producer2意识到他不能做任何工作,因此未能调用
notify
。现在你陷入了僵局

(编辑)如果调用了
notifyAll
,那么除了Producer2之外,Consumer1和Consumer2都会醒来。其中一个消费者可能已经消费了数据,然后依次调用
notifyAll
来唤醒至少一个生产者,从而允许非常失败的实现顺利运行

以下是我的场景基于的参考问题:

为什么Producer2会等待Producer1通知的对象?这没有任何意义。哦,这很奇怪,每个人都在你的“参考问题”中排队等候。这是一个失败的生产者/消费者示例,那么我会说……通常你有一个“空”监视器和一个“满”监视器;生产者等待完整监视器并通知空监视器,消费者等待空监视器并通知完整监视器。但是你确实成功地给出了一个例子。@markpeters,是的,没有人说代码有任何质量。我假设任何代码从OP中激发出这样一个一般性问题,都很容易像我的参考问题中的代码一样困惑。我认为你错了。假设您有三个消费者,但在给定的点上只有一个消费者可以做一些实际工作。如果您在此时使用
notifyAll
,实际上可以做一些工作的使用者可能会饿死,因为其他两个使用者可能会通过彼此之间的锁。@Tomas Jansson,实际上不是。主要是因为不能做工作的使用者实际上不会调用
notify()
notifyAll()
,因此无法唤醒彼此。记住,在老式的等待/通知范例中,调用notify只是为了告诉某人“嘿,我做了一些与此相关的事情,你可能想检查一下。”