Java - notify () против notifyAll () - возможная тупик? - PullRequest
3 голосов
/ 28 сентября 2010

Есть ли ситуации, в которых notify() может вызвать взаимоблокировку, но notifyAll() - никогда?

Например, в случае нескольких блокировок.notify() уведомляет о запуске только одного потока, который проверяет блокировку какого-либо объекта и снова ожидает, хотя другой поток может разблокировать этот объект.В случае использования notifyAll() все потоки будут уведомлены о запуске, и один из них, в свою очередь, обязательно разблокирует этот объект.

1 Ответ

6 голосов
/ 28 сентября 2010

Да. Представьте, что вы реализуете проблему «производитель - потребитель» с synchronize, wait, and notify. (правка) В котором 2 производителя и 2 потребителя ждут на одном мониторе объекта (конец редактирования) . Производитель вызывает notify в этой реализации. Теперь предположим, что у вас есть два потока, выполняющих путь кода источника. Возможно, что Producer1 вызывает notify и пробуждает Producer2. Producer2 понимает, что он не может выполнять какую-либо работу и впоследствии не может вызвать notify. Теперь вы зашли в тупик.

(правка) Если бы был вызван notifyAll, тогда и Consumer1, и Consumer2 проснулись бы в дополнение к Producer2. Один из потребителей потребил бы данные и, в свою очередь, вызвал бы notifyAll, чтобы разбудить хотя бы одного производителя, что позволило бы очень сломанной реализации успешно работать.

Вот контрольный вопрос, на котором я основываю свой сценарий: Зависит потребительский продукт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...