【问题标题】:java.lang.Object notify() - does it notify a thread at random, or the first one to call wait()?java.lang.Object notify() - 它是随机通知一个线程,还是第一个调用wait()?
【发布时间】:2013-08-05 09:53:47
【问题描述】:
假设我有 3 个线程(A、B 和 C)正在等待对象 O 上的监视器。线程 D 当前拥有对象 O 的监视器。当线程 D 调用 O.notify 时,哪个线程首先得到通知? A、B 还是 C?它是否基于这些线程中的第一个在对象 O 上调用 wait() ?也许我在谈论 notify() 和 notifyAll() 之间的区别?如果我猜的话,notify() 会通知第一个线程调用 wait(), notifyAll() 会通知所有调用 wait() 的线程,而下一个获取监视器的线程基本上是随机的?
【问题讨论】:
标签:
concurrency
wait
notify
【解决方案1】:
这是在监视器上等待的任何线程。来自section 17.2.2 of the JLS:
无法保证选择等待集中的哪个线程。这种从等待集中的移除使你能够在等待动作中恢复。但是请注意,在 t 完全解锁 m 的监视器之后的某个时间,恢复时 u 的锁定操作不会成功。
来自Object.notify docs:
唤醒在此对象的监视器上等待的单个线程。如果有任何线程正在等待该对象,则选择其中一个被唤醒。该选择是任意的,并由实施自行决定。线程通过调用wait 方法之一在对象的监视器上等待。