2015-12-26 30 views
3

我正在閱讀Java文檔,它說通知方法,它不會立即放棄控制。也就是說,如果在調用通知方法之後,在代碼的同步代碼塊中保留了一些代碼,那麼它將首先完成剩餘代碼,然後放棄控制權。等待方法是否立即放棄對鎖的控制

synchronized(this) { 
// line 1 
notify(); 
//line 2 
// line 3 
} 

第2行和第3行仍將被執行。等待方法是否會執行相同的功能

synchronized(this) { 
// line 1 
wait(); 
//line 2 
// line 3 
} 

是否會執行第2行和第3行?

回答

1

號從文檔上wait()

  1. 當前線程必須擁有該對象的監視器。
  2. 線程釋放此監視器的所有權,並且
  3. 等待另一個線程通知通過調用notify方法或notifyAll方法喚醒等待此對象監視器的線程。
  4. 該線程然後等待,直到它重新獲得顯示器的所有權和
  5. 恢復執行。

因此,點1對應於synchronized()聲明;點2 3和4在wait()方法中,點5對應代碼中的第2和第3行。

+0

你的意思是說,將立即放棄鎖和2號線和3號線時,它會重新獲取鎖將被執行。 – JManish

+0

第二行釋放鎖(在JVM中監聽)。 2&3基本上是原子的;這樣就不會有通知丟失。 –

1

這就是你剛剛閱讀的內容。第2和第3的wait呼叫後只運行一次的線程調用notify的synchronized塊完成:

被喚醒的線程將無法繼續進行,直到當前線程放棄此對象的鎖。被喚醒的線程會以通常的方式與可能,積極競爭到這個對象

(這是http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()

當然這一點是因爲兩個線程在同一同步上同步任何其他線程競爭(this)對象。