2013-08-04 17 views
0

假設我有3個線程(A,B和C)正在等待對象O上的監視器。線程D當前具有對象O的監視器。當線程D調用O.notify時,哪個線程首先得到通知? A,B或C?它是否基於這些線程中的第一個在對象O上調用wait()?也許我在談論notify()和notifyAll()之間的區別?如果我猜測,notify()會通知第一個線程調用wait(),notifyAll()會通知所有調用wait()的線程,並且下一個線程獲取監視器基本上是隨機的?java.lang.Object notify() - 它是隨機通知一個線程還是第一個調用wait()?

回答

2

這是任何正在顯示器上等待的線程。從section 17.2.2 of the JLS

無法保證等待集中的哪個線程被選中。從等待設置中刪除可以使您恢復等待操作。但是,請注意,直到完全解鎖m的顯示器之後的某段時間,您對恢復的鎖定操作才能成功。

而且從Object.notify docs

喚醒在此對象監視器上等待的單個線程。如果任何線程正在等待這個對象,則選擇其中一個線程來喚醒。這種選擇是任意的,並且由實施決定。線程通過調用wait方法之一等待對象的監視器。

相關問題