Получение исключения при выполнении условия ожидает?
Я получаю исключение каждый раз, когда запускаю следующий многопоточный код с мониторами.
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
методы.