【发布时间】:2021-06-30 11:12:36
【问题描述】:
我有以下课程:
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 的启动和停止方法,并且以与使用该 myObjectName 调用 MyObjectManager 的方法相同的顺序运行。但是,我不关心调用不同 MyObjects 实例方法的顺序。最初,地图是空的,我在第一次使用特定的 myObjectName 调用 MyObjectManager 的任何方法时创建每个 MyObject。
我认为这可以通过操作与 myObjects 映射同步操作的主锁来解决,例如检查、添加和检索 MyObjects 实例。但是在我通过从地图中检索它或通过创建它获得 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.lock() 是 ReentrantLock 吗?
标签: java multithreading locking