我有一個數據對象的存儲區,我希望一次同步與某個特定對象相關的修改。「規範」鎖對象的實現
class DataStore {
Map<ID, DataObject> objects = // ...
// other indices and stuff...
public final void doSomethingToObject(ID id) { /* ... */ }
public final void doSomethingElseToObject(ID id) { /* ... */ }
}
也就是說,我不希望我的數據存儲擁有單個鎖,因爲對不同數據對象的修改是完全正交的。相反,我希望能夠僅鎖定與單個數據對象相關的鎖。
每個數據對象都有一個唯一的ID。一種方法是創建一個ID => Lock
的地圖,並根據與該id關聯的一個鎖對象進行同步。另一種方法是做類似的事情:
synchronize(dataObject.getId().toString().intern()) {
// ...
}
但是,這看起來像是內存泄漏 - 內部化字符串可能永遠不會收集。
另一個想法是根據數據對象本身進行同步;然而,如果你有一個數據對象不存在的操作呢?例如,像addDataObject(DataObject)
這樣的方法會同步什麼?
總之,我怎麼可以編寫一個函數f(s)
,其中s
是String
,這樣f(s)==f(t)
如果s.equals(t)
在存儲安全的方式?
相當不錯,謝謝正確同步。 – Jake