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

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

  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();
    }
}

Есть идеи?

1 Ответ

3 голосов
/ 28 марта 2020

Для этого вы хотите 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();
    }
}
...