2011-04-06 128 views
12

我有一個問題..是確定的,如果我有這樣的事情:嘗試和鎖定問題

try 
{ 
    lock(programLock) 
    { 
     //some stuff 1 
    } 
} 
catch(Exception ex) { //stuff 2 } 

我很好奇,如果"some stuff 1"導致異常,確實programLock仍然鎖定?

回答

15

不行,將被釋放的鎖,鎖是大致相同的:

try 
{ 
    Monitor.Enter(programLock); 
    // some stuff 1 
} 
finally 
{ 
    Monitor.Exit(programLock); 
} 

(這意味着如果一個異常被拋出,Monitor.Exit將得到自動退出鎖定報表範圍的稱呼)

2

號離開鎖牙套總是會解鎖。

6

Lock()不過

try 
{ 
    Monitor.Enter(...); 
} 
finally 
{ 
    Monitor.Exit(....); 
} 

所以它已經照顧它。

4

msdn documentation

「......鎖或爲SyncLock確保了 底層監控被釋放,即使 如果受保護的代碼引發 例外。」

注:您可以創建自己的異常安全塊與塊using,.NET版的RAII成語的任意行爲。