2017-07-26 77 views
5

想象一下,我有3个等待条件的线程和一个带有通知条件的第4个线程。哪个线程会通知唤醒?

现在,所有3个等待线程都运行并进入等待状态。一旦完成,第4个线程将运行并调用一次通知。

该通知将如何确定要唤醒哪个线程?是叫等待第一个线程的线程,最后一个叫等待的线程还是基于其他条件?

假设wait和notify使用相同的锁。

+3

一个随机的,至少就你而言。从那里javadocs:“如果任何线程正在等待这个对象,他们中的一个被选中唤醒。这个选择是任意的,并且由实现决定。” – yshavit

回答

7

据我所知,有没有特殊的簿记 - 这意味着选择是“随机”。

所以说javadoc

如果任何线程在等待这个对象上,其中一人被选为被唤醒。这种选择是任意的,并且由实施决定。

因此这将是理论上可能的是,JVM执行决定制定特定的顺序;但如图所示 - 默认情况下,您不能指望任何订单。所以你不应该编写依赖于这种特定顺序的代码。

0

请参阅notify()方法的文档。

唤醒在该对象监视器上等待的单个线程。如果 任何线程正在等待这个对象,其中一个被选中为 被唤醒。 该选择是任意的,并且由 实施决定。