簡體   English   中英

線程在同步塊內崩潰時鎖定會發生什么?

[英]What happens to the lock when thread crashes inside a Synchronized block?

讓我們說Thread-1在對象上同步

synchronize(object){
  //statement1
  //statement2
  //statement3
}

如果Thread-1在statement2上崩潰,對象上的鎖會發生什么?當發生這種情況時,JVM會自動釋放Thread-1上的鎖嗎? 因為否則如果Thread-2正在為要釋放的對象鎖定並且Thread-1崩潰,則Thread-2將永遠等待。

它在JLS#14.19中定義:

synchronized ( Expression ) Block

如果塊的執行因任何原因突然完成,則監視器將被解鎖並且同步語句由於同樣的原因而突然完成。

你應該想到synchronized塊:

synchronized(lock) {
   // code
}

作為(偽代碼)的等價物:

lock.acquire();
try {
   // code
} finally {
   lock.release();
}

因此,無論代碼部分發生什么,鎖都將被釋放。

是的,顯示器(不是鎖定)將被釋放。

如果您希望閱讀它,Java VM規范將具體說明。

JVM規范中的確切參考可以在2.11.10節中找到

當調用設置了ACC_SYNCHRONIZED的方法時,執行線程進入監視器,調用方法本身,並退出監視器,無論方法調用是正常還是突然完成。 在執行線程擁有監視器期間,沒有其他線程可以輸入它。 如果在調用synchronized方法期間拋出異常並且synchronized方法不處理異常, 則在異步(重新)拋出異步方法之前,將自動退出該方法的監視器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM