我不知道是否像可能性例外的嘗試,終於
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
給出的代碼有任何機會,執行的線程可以執行lock
方法之後,但在進入try-finally
塊之前以某種方式結束?這會導致一個鎖,但從未釋放。 Java/JVM規範中是否有一些行可以保證,如果代碼是使用該慣用語編寫的,那麼就沒有機會離開永遠鎖定的鎖?
我的問題是,答案爲C#相關問題Can Monitor.Enter throw an exception?上MSDN
- https://blogs.msdn.microsoft.com/ericlippert/2007/08/17/subtleties-of-c-il-codegen/
- https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/
有關問題,這樣的代碼
Monitor.Enter(...)
try
{
...
}
finally
{
Monitor.Exit(..)
}
引用兩個帖子的啓發
th在C#的情況下,基於由JIT生成的機器代碼,執行永遠不會達到try-finally
的可能性很小。
我知道這可能被看作是一個人爲的問題/挑剔,但我的好奇心好轉了我。
也許與爲什麼[Thread.stop()已棄用](https://stackoverflow.com/questions/16504140/thread-stop-deprecated)相關。從來沒有聽說過類似Java中鏈接的noop這樣的問題,但當然這也會依賴於JVM。 – Kayaman
相關:https://stackoverflow.com/questions/31058681/java-locking-structure-best-pattern – assylias
出於所有實際的目的,您可以假設拋出異常並且鎖未鎖定,否則您將輸入try塊。顯然,這不包括突然的JVM崩潰等,在這種情況下鎖發生了什麼並不重要... – assylias