只有當一個或多個線程通過可鎖定資源創建循環的可能性創建循環依賴時,死鎖似乎纔有可能。可以通過在java鎖上始終使用tryLock來防止死鎖嗎?
一種選擇是通過仔細的靜態分析或通過獲取鎖的設計模式來避免這些週期。
但是,我們可以通過在鎖定界面上使用tryLock來防止死鎖嗎? tryLock試圖以原子方式獲取鎖,如果成功則返回true,如果它已經鎖定,則返回false,以便我們可以簡單地跳過代碼。
int sharedStateA = 0;
int sharedStateB = 0;
Lock lockA = new ReentrantLock();
Lock lockB = new ReentrantLock();
// possible deadlock safe solution
// executed by thread 1
void deadLockSafeUpdateAthenB(){
try {
if (lockA.tryLock()){
sharedStateA = sharedStateA + 1;
try {
if (lockB.tryLock()){
sharedStateB = sharedStateB + 1;
}
} finally {
lockB.unlock();
}
}
} finally {
lockA.unlock();
}
}
// executed by thread 2
void deadLockSafeUpdateBthenA(){
try {
if (lockB.tryLock()){
sharedStateB = sharedStateB + 1;
try {
if (lockA.tryLock()){
sharedStateA = sharedStateA + 1;
}
} finally {
lockA.unlock();
}
}
} finally {
lockB.unlock();
}
}
就死鎖而言應該是安全的,但您必須確保生成的行爲是正確的。 – shmosel
您是否知道,如果鎖定未獲取,狀態更新可能不會發生?我很難想象這種方法何時可能有用 – Anton