一、死鎖的本質與常見場景
1. 死鎖的四大必要條件
- 互斥:資源同一時間只能被一個線程持有。
- 占有并等待:線程持有資源的同時請求其他資源。
- 不可搶占:資源只能被持有者主動釋放。
- 循環等待:多個線程形成資源的循環依賴鏈。
2. 常見死鎖場景
- 數據庫事務死鎖:
-- 事務1 BEGIN; UPDATE account SET balance=balance-100 WHERE id=1; -- 鎖id=1 UPDATE account SET balance=balance+100 WHERE id=2; -- 等待鎖id=2-- 事務2 BEGIN; UPDATE account SET balance=balance-200 WHERE id=2; -- 鎖id=2 UPDATE account SET balance=balance+200 WHERE id=1; -- 等待鎖id=1
- 多線程代碼死鎖:
// 線程1 synchronized (lockA) {synchronized (lockB) { ... } }// 線程2 synchronized (lockB) {synchronized