【发布时间】:2011-09-19 12:06:51
【问题描述】:
我有一个数据对象存储,我希望一次同步与一个特定对象相关的修改。
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) if s.equals(t)?
【问题讨论】:
标签: java synchronization