Java 8 Reentrant Lock and Condition приводит к IllegalMonitorStateException: текущий поток не является владельцем

Я уже искал эту ошибку здесь, но я думаю, что мой фрагмент кода выглядит правильно:

  1. Я получаю блокировку вне попытки.. наконец
  2. У меня есть разблокировка в разделе finally
  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();
    }
}

Любые идеи?


person mariolpantunes    schedule 28.03.2020    source источник


Ответы (1)


Для этого вам нужно Condition.await().

Object.wait() - это другой метод, который требует удержания монитора объекта (synchornized(cond){} вокруг вызова)

So:

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();
    }
}
person k5_    schedule 28.03.2020
comment
Спасибо, это была ошибка, не знаю, как это ускользнуло от меня. - person mariolpantunes; 28.03.2020
comment
@NathanHughes Я не хотел предлагать ему использовать синхронизацию, я просто хотел объяснить, что означает ошибка. java.util.concurrent.locks.ReentrantLock - это просто другая концепция, чем мониторы уровня jvm на java.lang.Object - person k5_; 28.03.2020