C#死鎖案例代碼
簡介:
如下代碼實作建立兩個線程t1和t2,分别起初配置設定占用lock1和ock2資源。當一個線程t1占用資源lock1時,再去請求另外一個資源lock2時,此時由于另外一個線程t2在正占用資源t2,請求失敗,等待釋放資源。同時t2又送出請求資源lock1,但是lock1又被t1占用,沒有釋放,也隻能進行等待。此時兩個線程隻能等待一直等待對方釋放資源,這就稱之為死鎖。
namespace Deadlock
{
class DL
{
int field1 = 0;
int field2 = 0;
private object lock1 = new int[1];
private object lock2 = new int[1];
public void First(int val)
{
lock (lock1)
{
Console.WriteLine("First: Acquired lock 1: "
+ Thread.CurrentThread.GetHashCode() + " Now Sleeping.");
//Try commenting Thread.Sleep()
Thread.Sleep(1000);//此時t2線程占用資源
Console.WriteLine("First: Acquired lock 1: "
+ Thread.CurrentThread.GetHashCode() + " Now wants lock2.");
//當請求鎖lock2時,lock被t2線程占用,等待釋放
lock (lock2)
{
Console.WriteLine("First: Acquired lock 2: "
+ Thread.CurrentThread.GetHashCode());
field1 = val;
field2 = val;
}
}
}
public void Second(int val)
{
lock (lock2)
{
Console.WriteLine("Second: Acquired lock 2: "
+ Thread.CurrentThread.GetHashCode());
//當請求鎖lock1時,lock1被t1線程占用,等待釋放
lock (lock1)
{
Console.WriteLine("Second: Acquired lock 1: "
+ Thread.CurrentThread.GetHashCode());
field1 = val;
field2 = val;
}
}
}
}
public class MainApp
{
DL d = new DL();
public static void Main()
{
MainApp m = new MainApp();
Thread t1 = new Thread(new ThreadStart(m.Run1));
t1.Start();
Thread t2 = new Thread(new ThreadStart(m.Run2));
t2.Start();
Console.ReadLine();
}
public void Run1()
{
this.d.First(10);
}
public void Run2()
{
this.d.Second(10);
}
}
}
本文來自部落格園,作者:農碼一生,轉載請注明原文連結:https://www.cnblogs.com/wml-it/p/14798281.html
技術的發展日新月異,随着時間推移,無法保證本部落格所有内容的正确性。如有誤導,請大家見諒,歡迎評論區指正! 個人開源代碼連結: GitHub:https://github.com/ITMingliang
Gitee:https://gitee.com/mingliang_it
GitLab:https://gitlab.com/ITMingliang
進開發學習交流群:![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5Ce2hjM0QTNwgTM4ATMy8Fdvw1N2YDM2cTMvwFdp1Cbtd3Lc12bj91cn9Gbi52YvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)