如果多個執行緒以不同的順序持有多個鎖, 可能發生死鎖:
public class accounttrans
}} }
}
transfermoney方法先後鎖定fromaccount和toaccount物件. 如果2個執行緒以如下的方式呼叫transfermoney方法:
a: transfermoney(myaccount, youraccount, 10);
b: transfermoney(youraccount, myaccount, 20);
死鎖有可能就會發生.
關鍵在於需要保證以相同的順序獲取多個鎖:
public class accounttrans
}} // 計算fromacct和toacct的hashcode值
int fromhash = system.identityhashcode(fromacct);
int tohash = system.identityhashcode(toacct);
// 根據hashcode值確定獲取鎖的順序
if (fromhash < tohash)
}} else if (fromhash > tohash)
}} else }}
} }}
open call
所謂open call是指在未持有鎖時呼叫外部方法. 持有鎖的時候呼叫外部方法, 如果被呼叫的方法需要獲取其他的鎖, 可能帶來死鎖的風險. 如果被呼叫的方法發生阻塞, 當前執行緒將長時間持有鎖, 其他等待獲取該鎖的執行緒就會被阻塞.
因此我們應該盡量在未持有鎖的時候進行方法的呼叫.
資源死鎖
比如執行緒a持有資料庫d1的連線, 並等待獲取資料庫d2的連線. 而執行緒b持有資料庫d2的連線, 並等待獲取資料庫d1的連線. 此時就發生了死鎖.
資源死鎖的另一種形式是執行緒飢餓死鎖, 參見第八章.
避免死鎖
1. 盡量不要同時持有多個鎖.
2. 如果必須同時持有多個鎖, 那麼保證以一致的順序獲取鎖.
3. 盡量在未持有鎖的情況下進行方法的呼叫(open call).
如何避免死鎖
如何避免死鎖 1 使用事務時,盡量縮短事務的邏輯處理過程,及早提交或回滾事務 2 設定死鎖超時引數為合理範圍,如 3分鐘 10分種 超過時間,自動放棄本次操作,避免程序懸掛 3 優化程式,檢查並避免死鎖現象出現 4 對所有的指令碼和sp都要仔細測試,在正是版本之前。5 所有的sp都要有錯誤處理 通過...
如何避免死鎖
什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...
如何避免死鎖
什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...