Рассмотрим следующие утверждения исполнения:Java: Вечно ждет THEAD
(1) Тема A: Чеки для конкретного состояния блокировки и не (2) Тема A: Поэтому пытается идти в состояние ожидания (3) Thread B: Выполнено с конкретной задачей и изменено состояние блокировки, которое требуется по потоку A (4) Резьба B: Сигналы notifyAll()
Рассмотрите, должна ли виртуальная машина Java переупорядочить код для выполнения в следующем порядке (1), (3), (4), (2). Я считаю, что такое условие возможно, и в таком случае может возникнуть проблема, потому что Thread A ожидает состояния ожидания навсегда, так как нет другого потока для уведомления!
EDIT 1: Я не использую синхронизированный блок с целью блокировки. Скорее я использую AtomicInteger, чтобы получить блокировку кода. Рассмотрим класс RWLock и он имеет атомную переменную N. С увеличением числа или считыванием числа считывателей и писателей, входящих в состояние блокировки. Вопрос применим к такому условию, а не к синхронизированным блокам/методам.
Вот почему вам нужно удерживать блокировку объекта для вызова ждать или уведомить об этом. Это делает вашу последовательность невозможной. Если я не понял правильно, отправьте код, который иллюстрирует ваш вопрос. –
Я внес некоторые изменения. Если вам нужна дополнительная информация, пожалуйста, спросите. –