【问题标题】:Concurrency (ReentrantLock) in different threads不同线程中的并发(ReentrantLock)
【发布时间】:2016-11-14 10:15:01
【问题描述】:

我需要在不同的线程中使用 ReentrantLock。有可能吗? 附言在 secondMethod "lock.unlock()" 中抛出 IllegalMonitorStateException。

public class SomeClass {
    private static ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<>();
    private final Lock lock = new ReentrantLock();

    public void firstMethod(Action action) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //SOME CODE BEFORE LOCK
                lock.lock();
                //SOME CODE AFTER UNLOCK
            }
        }).start();
    }

    public void secondMethod(Action action) {
        if (hashMap.get("key").length() == 3)
            lock.unlock();
    }
}

编辑:用 java.util.concurrent.locks.Condition 解决!

【问题讨论】:

    标签: java multithreading concurrency java.util.concurrent illegalmonitorstateexcep


    【解决方案1】:

    锁定的线程也应该是解锁的线程。尝试以任何其他方式解决它会导致竞争条件。

    【讨论】:

      【解决方案2】:

      这肯定是可能的,因为所有的锁结构都是由不同的线程调用的。

      您在第二个线程中遇到错误,因为您的方法在释放之前没有通过调用 lock.lock() 来锁定 Lock 对象;因此您的线程在解锁之前并不拥有锁,这是不允许的。

      【讨论】:

      • 我知道。但是如何解决呢?
      • 不知道你想实现什么逻辑我们怎么能推荐:)
      • 暂停执行 firstMethod 直到调用 secondMethod
      • 那么你需要确保你先锁定第二个线程中的锁;然后第一个线程将其锁定;然后第二个线程释放它。
      • 用 java.util.concurrent.locks.Condition 类轻松解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多