死鎖核心原因:多線程以不同順序獲取同一組鎖。轉帳案例完美演示經典死鎖場景。
public void Transfer(Account from, Account to, decimal amount) {
Monitor.Enter(from); // 鎖定賬戶 A
Monitor.Enter(to); // 鎖定賬戶 B
// 業務邏輯...
Monitor.Exit(from);
Monitor.Exit(to);
}
// 線程 1:Transfer(A, B) → 鎖 A → 鎖 B
// 線程 2:Transfer(B, A) → 鎖 B → 鎖 A
// 經典死鎖形成
public void Transfer(Account from, Account to, decimal amount) {
// 根據不可變標識(如 ID)排序,保證全局一致獲取順序
var first = from.Id < to.Id ? from : to;
var second = from.Id < to.Id ? to : from;
lock (first) {
lock (second) {
// 安全轉帳邏輯
}
}
}