2010-07-22 18 views
4

對於下面的例子,執行i ++之前會釋放鎖嗎?換句話說,當一個函數在鎖內被調用時,鎖是否會被釋放?c#裏面的函數鎖(obj)

lock (lockerobject /*which is static*/) 
{ 
    call2anotherFunction(); 
    i++; 
} 

回答

6

直到lock塊被退出,鎖纔會被釋放。 lock不知道或關心你在塊內執行的代碼。

事實上,作爲一般規則,發生了什麼內部的塊是不知道什麼是外面的吧:

if (condition) 
{ 
    // The if doesn't know what happens in here 
} 

using (var reader = XmlReader.Create(url)) 
{ 
    // using doesn't care what happens in here 
    throw new Exception("Unless..."); 
} // Dispose will be called on reader here 

但處置纔會被調用,因爲塊是已退出,不僅僅是因爲throw發生在它內部。

2

不,它不會被釋放。如果你想讓它釋放,在函數調用後啓動鎖。

call2anotherFunction(); 
lock (lockerobject which is static) 
{ 
    i++; 
} 
6

不,只有當代碼執行離開lock塊的範圍時,鎖纔會被釋放。

3

鎖定將一直持續到您的執行點離開大括號。所以當執行i ++時,hte鎖仍然會被保留。

如果cal2anotherfunction拋出一個異常,我++永遠不會被執行,而當堆解開了創建鎖功能的鎖將被釋放(沒有有效的嘗試,終於繞鎖)

+0

+ 1例外談話。 – 2010-07-22 15:25:38