2017-07-26 79 views
5

想象一下,我有3個等待條件的線程和一個帶有通知條件的第4個線程。哪個線程會通知喚醒?

現在,所有3個等待線程都運行並進入等待狀態。一旦完成,第4個線程將運行並調用一次通知。

該通知將如何確定要喚醒哪個線程?是叫等待第一個線程的線程,最後一個叫等待的線程還是基於其他條件?

假設wait和notify使用相同的鎖。

+3

一個隨機的,至少就你而言。從那裏javadocs:「如果任何線程正在等待這個對象,他們中的一個被選中喚醒。這個選擇是任意的,並且由實現決定。」 – yshavit

回答

7

據我所知,有沒有特殊的簿記 - 這意味着選擇是「隨機」。

所以說javadoc

如果任何線程在等待這個對象上,其中一人被選爲被喚醒。這種選擇是任意的,並且由實施決定。

因此這將是理論上可能的是,JVM執行決定製定特定的順序;但如圖所示 - 默認情況下,您不能指望任何訂單。所以你不應該編寫依賴於這種特定順序的代碼。

0

請參閱notify()方法的文檔。

喚醒在該對象監視器上等待的單個線程。如果 任何線程正在等待這個對象,其中一個被選中爲 被喚醒。 該選擇是任意的,並且由 實施決定。