| 策略 | 核心思想 | 代表演算法 |
|---|---|---|
| 預防 | 破壞四條件之一 | 一次性申請所有資源、資源有序分配法 |
| 避免 | 動態判斷安全狀態 | 銀行家演算法 |
| 檢測與恢復 | 允許死鎖發生,定期檢測並恢復 | 資源分配圖環檢測、進程終止/資源剝奪 |
模擬銀行放款:系統記錄 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、無鎖隊列替代粗粒度同步。銀行家演算法理論優雅但工程落地較少 (需知進程最大需求、額外開銷大)。實際開發中預防 (有序鎖) + 超時 + 監控 組合拳最實用。