gpt4 book ai didi

java - "canonical"锁对象的实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:33 28 4
gpt4 key购买 nike

我有一个数据对象存储库,我希望一次同步与一个特定对象相关的修改。

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) 以内存安全的方式?

最佳答案

直接给这个DataObject加锁,你可以这样定义它:

public class DataObject {
private Lock lock = new ReentrantLock();

public void lock() { this.lock.lock(); }
public void unlock() { this.lock.unlock(); }
public void doWithAction( DataObjectAction action ) {
this.lock();
try {
action.doWithLock( this ) :
} finally {
this.unlock();
}
}

// other methods here

}

public interface DataObjectAction { void doWithLock( DataObject object ); }

在使用时,你可以简单地这样做:

DataObject object = // something here
object.doWithAction( new DataObjectAction() {

public void doWithLock( DataObject object ) {
object.setProperty( "Setting the value inside a locked object" );
}

} );

你有一个对象被锁定以进行更改。

如果您在写入时也发生读取操作,您甚至可以将其设置为读写锁。

关于java - "canonical"锁对象的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7465961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com