我正在處理一個代碼,它將輸入資源列表並嘗試鎖定其中的每一個。如果有人失敗,它會努力釋放所有資源上的鎖。這意味着要麼「所有」資源有鎖或根本沒有。我有兩種方法,我沒有看到任何顯着的優勢。這種情況下的標準編碼實踐是什麼?是否有任何設計模式的名稱?一個函數應該共享兩個責任,還是我們應該使用狀態檢查函數
OPTION 1:
// one function taking on 2 responsibilities. appears bad to have unlock code in locking function
public boolean getLock(List<Resource> resources) {
for (Resource r : resources) {
if (! Lock.getLock(r)) {
releaseLocks(resources);
return false;
}
}
return true;
}
OPTION 2:
public boolean getLock(List<Resource> resources) {
for (Resource r : resources) {
if (! Lock.getLock(r)) {
return false;
}
}
return true;
}
public boolean stateChecker(List<Resource> resources) {
if (!getLock(resouces)) {
releaseLocks(resources);
return false;
}
return true;
}
很多都會回到上下文中,我個人主要嘗試使用第二種選擇,根據需要(也就是說,只有一個資源可以鎖定)你可能需要第一個,但你也可以爭辯說,如果你嘗試獲得一個已經存在鎖的新鎖,你也可以拋出一個異常 – MadProgrammer
這裏主要的問題是所有的步驟總是試圖鎖定資源**爲了避免死鎖或活鎖 –
一些想法。鎖是資源的屬性 - 即爲什麼不是(布爾)r.lock(),(布爾值)r.isLocked(),r.unlock()?如果這是他們可以'同步'(如果需要 - 如果沒有,爲什麼你鎖定他們呢?)它看起來像所有這些方法可能是靜態的(目前給出)。無論如何,它們應該是最終的。什麼會阻止其他的東西(另一個線程,請求,什麼)釋放一個獲得的鎖,當它不應該?資源是接口還是具體類?其中任何一項都可能影響如何最好地保護這些資源。 – Paul