程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#線程系列講座(4):同步與死鎖(4)

C#線程系列講座(4):同步與死鎖(4)

編輯:關於C語言

在 上面的代碼中,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#中其他的同步技術。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved