Получение исключения при выполнении условия ожидает? - PullRequest
0 голосов
/ 10 марта 2011

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

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

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

Спасибо

1 Ответ

2 голосов
/ 10 марта 2011

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

...