0

我需要在不同的线程中使用 ReentrantLock。有可能吗?PS 在 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 解决!

4

2 回答 2

0

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

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

于 2016-11-14T10:24:41.290 回答
0

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

于 2016-11-14T10:21:55.870 回答