對於下面的例子,執行i ++之前會釋放鎖嗎?換句話說,當一個函數在鎖內被調用時,鎖是否會被釋放?c#裏面的函數鎖(obj)
lock (lockerobject /*which is static*/)
{
call2anotherFunction();
i++;
}
對於下面的例子,執行i ++之前會釋放鎖嗎?換句話說,當一個函數在鎖內被調用時,鎖是否會被釋放?c#裏面的函數鎖(obj)
lock (lockerobject /*which is static*/)
{
call2anotherFunction();
i++;
}
直到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
發生在它內部。
不,它不會被釋放。如果你想讓它釋放,在函數調用後啓動鎖。
call2anotherFunction();
lock (lockerobject which is static)
{
i++;
}
不,只有當代碼執行離開lock
塊的範圍時,鎖纔會被釋放。
鎖定將一直持續到您的執行點離開大括號。所以當執行i ++時,hte鎖仍然會被保留。
如果cal2anotherfunction拋出一個異常,我++永遠不會被執行,而當堆解開了創建鎖功能的鎖將被釋放(沒有有效的嘗試,終於繞鎖)
+ 1例外談話。 – 2010-07-22 15:25:38