2013-04-07 73 views
0

我希望快速的問題。如果我使用Java中的對象調用notify,是否保證不喚醒在調用notify之後等待(嚴格)的任何線程。換句話說,通知只喚醒已經在等待的線程。據推測,notifyAll將表現相同的方式。等待和通知的順序

例如,如果保證不成立的話,那就在這個順序是可能的:

  1. 線程n取得鎖,來電通知,並釋放鎖。
  2. 線程W獲得鎖,調用等待並釋放鎖。
  3. 主題W由線程喚醒獅集團的通知,並繼續...

感謝您的幫助!

回答

0

當你調用通知正在等待的線程之一(如果有的話)將被喚醒。當前沒有等待這個對象的線程不能被等待,並且線程沒有等待(但是稍後會等待)也不能被喚醒(顯然)。

如果您調用notifyAll,則會喚醒當前正在等待的所有線程。

我建議你閱讀命中here

0

那麼,對於notify()方法的javadoc明確規定,即:

喚醒在一個線程等待在該對象的監視器上。

notifyAll()同樣的事情:

喚醒在等待在該對象的監視器上的全部線程。

爲了被放置在等待線程隊列,線程必須首先獲得該對象的鎖,然後釋放它,然後才其他線程將能夠獲得鎖定並調用notify()

所以我想你不必擔心它。