Вы смешиваете старые внутренние замки и их механизм сигнализации (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
методов.