【问题标题】:How to implement master lock that leads into locking one of multiple locks?如何实现导致锁定多个锁之一的主锁?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多