2016-08-02 192 views
0

我查看過周圍SO和網絡的答案,但只發現一個爲其他語言(C + +,蟒蛇)和閱讀沒有提供足夠明確的答案。鎖定狀態,如果線程死亡

如果一個線程有一個被鎖定的代碼塊,並且線程因爲某種原因(被強行殺死)而處於鎖定塊內部,那麼該鎖仍然會被強制執行(即其他線程不會能夠使用獲得該鎖)?

如:

class myClass { 
    private static object myLock = new Object(); 

    public void foobar() 
    { 
     lock(myLock) 
     { 
      //code 
     } 
    } 
} 

如果線程A死了,線程B試圖調用foobar的,將它能夠?還是會陷入僵局?

+0

「我查看過周圍和網絡上的答案」 - 嘗試在您最喜愛的搜索引擎中查找「c#鎖定例外」。 – Dennis

+0

已編輯。我不相信這是重複的。我已經移除了異常部分,並且對線程本身在鎖中死亡時發生的情況更感興趣,而沒有發生異常。如果線程被殺死了,鎖定會被釋放嗎? –

回答

0

如下所示,鎖定語句被轉換爲try-finally與Monitor.Enter Monitor.Exit組合,最終在兩種情況下都會在發生異常時執行,以確保鎖定被釋放。這個answerEric Lippert解釋了在c#中的鎖定實現。

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 
0

聲明

lock(myLock) 
{ 
    //code 
} 

相當於

System.Threading.Monitor.Enter(myLock); 
try 
{ 
    //code 
} 
finally 
{ 
    System.Threading.Monitor.Exit(myLock); 
} 

因此,如果一個線程終止,那麼異常將會被拋出finally聲明將從對象myLock解除鎖定。

查看文檔Monitor class,它對鎖定概念有很好的解釋和示例。