如何避免死鎖 JCIPC10讀書筆記

2021-09-01 05:06:48 字數 1081 閱讀 6046

如果多個執行緒以不同的順序持有多個鎖, 可能發生死鎖:

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 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...