首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

死鎖避免策略:銀行家演算法詳解與其他預防/檢測方法

     編輯:程式設計綜合問答

死鎖四必要條件 (同時滿足才會死鎖)

  1. 互斥條件
  2. 請求與保持條件
  3. 不剝奪條件
  4. 循環等待條件

三大處理策略

策略核心思想代表演算法
預防破壞四條件之一一次性申請所有資源、資源有序分配法
避免動態判斷安全狀態銀行家演算法
檢測與恢復允許死鎖發生,定期檢測並恢復資源分配圖環檢測、進程終止/資源剝奪

銀行家演算法核心邏輯

模擬銀行放款:系統記錄 Max(最大需求)、Allocation(已分配)、Need(尚需)、Available(可用)。進程請求資源時,嘗試分配並執行安全性檢查:能否找到一個序列 <P1, P2, ...> 使每個進程都能獲得所需資源並歸還?若能則安全,允許分配;否則拒絕,進程等待。

簡化範例 (單資源類型)

系統總資源 10
P0: Max=7, Alloc=5, Need=2
P1: Max=4, Alloc=2, Need=2
P2: Max=9, Alloc=3, Need=6
Available = 10 - (5+2+3) = 0

P1 請求 2 → Available=0 不滿足 → 等待
P0 歸還 5 → Available=5
檢查序列:P1 Need=2 ≤ 5 → 執行完歸還 4 → Available=9
           P0 Need=2 ≤ 9 → 執行完歸還 7 → Available=16
           P2 Need=6 ≤ 16 → 執行完
安全序列存在 → 系統安全

其他避免死鎖實用技巧

  • 資源有序編號法:所有資源統一編號,進程必須按編號遞增順序請求,打破循環等待。
  • 超時機制:鎖獲取設定超時 (如 tryLock(5, TimeUnit.SECONDS)),超時釋放已持有鎖並重試。
  • 減少鎖粒度/範圍:用 ConcurrentHashMap、ThreadLocal、無鎖隊列替代粗粒度同步。
  • 避免巢狀鎖:若必須多鎖,統一按固定順序獲取 (如先鎖 A 再鎖 B)。

工程建議

銀行家演算法理論優雅但工程落地較少 (需知進程最大需求、額外開銷大)。實際開發中預防 (有序鎖) + 超時 + 監控 組合拳最實用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved