static object objA = new object(), objB = new object();
static void LockA() {
lock (objA) { Thread.Sleep(1000); lock (objB) { } }
Console.WriteLine("LockA");
}
static void LockB() {
lock (objB) { Thread.Sleep(2000); lock (objA) { } }
Console.WriteLine("LockB");
}
執行緒 A 鎖 A → Sleep → 等 B;執行緒 B 鎖 B → Sleep → 等 A → 互相等待 → 死結。
static void LockB_Fixed() {
lock (objA) { Thread.Sleep(2000); lock (objB) { } }
Console.WriteLine("LockB");
}
所有執行緒遵循相同鎖獲取順序 (A → B),打破循環等待條件。
Thread a = new Thread(LockA), b = new Thread(LockB);
a.Start(); b.Start();
Thread.Sleep(4000);
a.Abort(); b.Abort(); // 強制終止
Console.WriteLine("執行緒全部結束");
警告:Thread.Abort 極不推薦,會導致資料不一致、鎖未釋放、finally 區塊可能不執行,僅作緊急處理示範。