Java 8 可重入锁和条件导致 IllegalMonitorStateException:当前线程不是所有者

mar*_*nes 4 java locking reentrantlock

我已经在这里搜索过这个错误,但我认为我的代码看起来是正确的:

  1. 我在尝试之外获得了锁..终于
  2. 我在最后部分有一个解锁
  3. 我只是试图等待锁内的情况。
  4. 我什至打印当前锁是否由该线程持有并且返回 true。

这是代码的摘录,如果我尝试运行代码,我会得到 java.lang.IllegalMonitorStateException:当前线程不是所有者。错误出在 cond.wait() 方法中。

public void takeARest() {
    lock.lock();
    try {
        while (disembark < totalPassengers) {
            System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
            cond.wait();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

k5_*_*k5_ 5

为了你想要的Condition.await()

Object.wait()是一种不同的方法,需要持有对象的监视器(synchornized(cond){}在调用周围)

所以:

public void takeARest() {
    lock.lock();
    try {
        while (disembark < totalPassengers) {
            System.err.printf("Held by %s%n",lock.isHeldByCurrentThread());
            cond.await();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)