Выбор ответа Senior Потоки и Java Memory Model обновлено
wait в цикле
Вопрос
Почему wait() вызывают в цикле while (!condition) lock.wait();, а не в if?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Бывают ложные пробуждения, и условие могло снова стать ложным. Спецификация допускает spurious wakeup, к тому же после notifyAll сначала проснувшийся поток может забрать ресурс, и условие для остальных снова ложно.
Варианты ответа
- Потому что
wait()возвращает управление сразу, без ожидания уведомления - Чтобы не держать монитор во время ожидания и дать другим потокам войти
- Это требование компилятора:
wait()внутриifне скомпилируется - Бывают ложные пробуждения, и условие могло снова стать ложнымправильный ответ
Разбор
Спецификация допускает spurious wakeup, к тому же после notifyAll сначала проснувшийся поток может забрать ресурс, и условие для остальных снова ложно. Поэтому условие перепроверяют. wait() действительно ждёт и при этом отпускает монитор сам по себе, цикл для этого не нужен. Компилятор if не запрещает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.