如何实现导致锁定多个锁中的一个的主锁



我有以下类:

class MyObjectManager {
Map<String, MyObject> myObjects;
void start(String myObjectName) {
// Create or reuse myObject for given name and run its a() method.
}
void stop(String myObjectName) {
// Create or reuse myObject for given name and run its b() method.
}
}
class MyObject {
void start() {
// do something
}
void stop() {
// do something
}
}

我需要为每个MyObject实例同步运行MyObject的start和stop方法,并且使用该myObjectName调用MyObjectManager的方法的顺序相同。然而,我并不关心调用不同MyObjects实例的方法的顺序。最初,映射是空的,我在第一次使用特定的myObjectName调用MyObjectManager的任何方法时创建每个MyObject。

我认为这可以通过操作主锁来解决,该主锁将操作与myObjects映射同步,例如检查、添加和检索myObjects实例。但是,在我通过从映射中检索或创建MyObject实例获得MyObject实例后,我需要锁定MyObject实例并释放主锁,这样在执行MyObject.a((或MyObject.b((时就不会不必要地锁定它。

我习惯于在finally块中进行解锁,所以我认为代码类似于

void start(String myObjectName) {
MyObject myObject = null;
try {
synchronized(myObjects) {
myObject = createOrRetrieveMyObject(myObjectName);
if (myObject == null) {
// It's possible that myObjectName is invalid and MyObject will not be created.
return;
}
myObject.lock();        ​
​ }
myObject.start();
} finally {
​     if (myObject != null) {
​     myObject.unlock();
​}
}
}

这看起来不好看。有更好的方法吗?

我需要为每个MyObject实例同步运行MyObject的启动和停止方法。。。

我认为在MyObject.start()MyObject.stop()中实现这种同步逻辑可能更方便(例如,您可以使这些方法成为synchronized(,而不是每次有人调用这些方法时都要求使用lock()+unlock()

最新更新