2011-06-07 87 views
16

在對象上線程可以wait之前,它必須獲取該對象上的監視器。監視器隨後被釋放,並且該線程一旦被喚醒就試圖重新獲取它。Java:線程在對象上等待時是否釋放所有監視器?

但是當線程調用wait時線程保持其他監視器會發生什麼?

考慮這個例子:

 
    Object a = // ... 
    Object b = // ... 

    synchronized(a) 
    { 
     synchronized(b) 
     { 
      b.wait(); 
      // continue 
     } 
    } 

當線程調用b.wait(),將其發佈在ab,或僅b鎖?

回答

15

只有b

這些類型的問題的權威來源是Java語言規範。在這種情況下的相關部分是17.8 Wait Sets and Notification

讓螺紋是線程上執行對象 wait方法,並讓Ñ通過是鎖定動作的數量在m未被解鎖動作匹配。以下操作之一發生。

  • [...]
  • 否則,按以下順序發生:

    1. 螺紋被添加到等待集中對象的,並且執行Ñ解鎖動作on m
    2. [...]
7

AFAIK only b。這是死鎖的經典來源。

10

Object class的Java API文檔:

當前線程必須擁有該 對象的監視器。該線程釋放的這款顯示器 所有權並等待 直到另一個線程通知 等待在該對象的監視器上 喚醒無論是通過調用 通知方法或notifyAll方法。 線程然後等待,直到 重新獲得顯示器的所有權,並且 恢復執行。

因此,致電b.wait()只解鎖b

相關問題