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

Java 8 Reentrant Lock and Condition results in IllegalMonitorStateException: current thread is not owner

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

  1. 我在 try..finally 之外获得了锁
  2. 我在finally部分有一个解锁
  3. 我只尝试等待锁内的条件。
  4. 如果当前锁被该线程持有并且它 returns 为真,我什至打印。

这是代码的摘录,如果我尝试 运行 我得到的代码 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();
    }
}

有什么想法吗?

你想要的 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();
    }
}