我有以下类:
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()
。