0

假设我有 3 个线程(A、B 和 C)正在等待对象 O 上的监视器。线程 D 当前具有对象 O 的监视器。当线程 D 调用 O.notify 时,哪个线程首先得到通知?A、B 还是 C?它是否基于这些线程中的第一个在对象 O 上调用 wait() ?也许我在谈论 notify() 和 notifyAll() 之间的区别?如果我猜的话,notify() 会通知第一个线程调用 wait() 并且 notifyAll() 会通知所有调用 wait() 的线程,并且下一个获取监视器的线程基本上是随机的?

4

1 回答 1

4

它是在监视器上等待的任何线程。从JLS 的第 17.2.2 节

无法保证选择等待集中的哪个线程。这种从等待集中的移除使你能够在等待动作中恢复。但是请注意,在 t 完全解锁 m 的监视器之后的某个时间,恢复时 u 的锁定操作不会成功。

Object.notify文档中:

唤醒正在此对象的监视器上等待的单个线程。如果有任何线程正在等待该对象,则选择其中一个被唤醒。该选择是任意的,并由实施自行决定。线程通过调用其中一种wait方法在对象的监视器上等待。

于 2013-08-04T17:19:32.400 回答