假设我有3个线程(A,B和C)正在等待对象O上的监视器。线程D当前具有对象O的监视器。当线程D调用O.notify时,首先通知哪个线程? A,B还是C?它是基于第一个在对象O上调用wait()的线程吗?也许我在谈论notify()和notifyAll()之间的区别?如果我猜测,notify()会通知第一个线程调用wait()而notifyAll()会通知所有调用wait()的线程并且下一个线程让监视器基本上是随机的吗?
答案 0 :(得分:2)
正在等待监视器的任何线程。来自section 17.2.2 of the JLS:
无法保证等待集中的哪个线程被选中。从等待集中删除可以使您在等待操作中恢复。但是请注意,在完全解锁监视器m之后的一段时间之后,恢复时的锁定操作才能成功。
唤醒正在此对象监视器上等待的单个线程。如果任何线程正在等待此对象,则选择其中一个线程被唤醒。选择是任意的,由实施决定。线程通过调用
wait
方法之一等待对象的监视器。