Получение исключения при выполнении условия ожидает?

Я получаю исключение каждый раз, когда запускаю следующий многопоточный код с мониторами.

http://pastebin.com/jTGR98W9 http://pastebin.com/hKvuDX2d

Каждый раз, когда я выполняю сигнал условия, я получаю исключение, которое говорит, что оно должно быть эксклюзивным, однако оно является эксклюзивным, учитывая, что оно синхронизировано. Или я что-то не так делаю?

Спасибо

1 ответ

Решение

Вы смешиваете старые внутренние замки и их сигнальный механизм (synchronized, wait а также notify) с новым Lock а также Condition классы, хотя они не имеют никакого отношения. Это источник путаницы, поэтому я бы придерживался одного из них (желательно Lock а также Condition).

Возможно, ваша проблема вызвана тем, что вы не удерживаете блокировку, связанную с условием, когда вы звоните. signal(), Окружить методы вызовами lock() а также unlock():

public void canEat(String name) {
   lock.lock();
   try {
       eaters.add(name);
       if (eaters.size() > 0) {
          canFeed.signal();
       }
   } finally {
       lock.unlock();
   }
}

То же самое нужно сделать для другого synchronized методы.

Другие вопросы по тегам