在 上面的代碼中,LockA方法會在當前線程中執行完Lock(objA)後延遲1秒,而LockB 方法會在執行完lock(objB)後延遲2秒,一般LockA會先執行lock(objB),但這時 objB已經被LockB鎖住了,而且LockB還在延遲(2秒還沒到)。在這時,LockA已 經將objA和objB都鎖上了,當LockB執行到lock(objA)時,由於objA已經被鎖上, 因此,LockB就被阻塞了。而LockA在執行到lock(objB)時,由於這時LockA還在 延遲,因此,objB也被鎖住了。LockA和LockB也就相當於上述的兩個學生,互相 等待對方關燈,但誰也不肯先關燈,所以就死鎖了。如果采用第一種方法非常簡 單,就是保持被鎖定的多個對象的順序,如將LockB方法的鎖定順序換一下,代碼 如下:
public static void LockB()
{
lock (objA)
{
Thread.Sleep(2000);
lock (objB)
{
}
}
Console.WriteLine("LockB");
}
或是將LockA方 法也改一下,先鎖objB,再鎖objA。
當然,也可以采用暴力一點的方法, 當發現一些線程長時間沒反應時,可以使用Abort方法強行中斷它們。代碼如下:
public static void Main()
{
Thread threadA = new Thread(LockA);
Thread threadB = new Thread(LockB);
threadA.Start();
threadB.Start();
Thread.Sleep(4000);
threadA.Abort();
threadB.Abort();
Console.WriteLine("線程全部結束");
}
在後面的文章中將講解C#中其他的同步技術。