Выбор ответа Senior Потоки и Java Memory Model обновлено

wait в цикле

Вопрос

Почему wait() вызывают в цикле while (!condition) lock.wait();, а не в if?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Бывают ложные пробуждения, и условие могло снова стать ложным. Спецификация допускает spurious wakeup, к тому же после notifyAll сначала проснувшийся поток может забрать ресурс, и условие для остальных снова ложно.

Варианты ответа

  1. Потому что wait() возвращает управление сразу, без ожидания уведомления
  2. Чтобы не держать монитор во время ожидания и дать другим потокам войти
  3. Это требование компилятора: wait() внутри if не скомпилируется
  4. Бывают ложные пробуждения, и условие могло снова стать ложнымправильный ответ

Разбор

Спецификация допускает spurious wakeup, к тому же после notifyAll сначала проснувшийся поток может забрать ресурс, и условие для остальных снова ложно. Поэтому условие перепроверяют. wait() действительно ждёт и при этом отпускает монитор сам по себе, цикл для этого не нужен. Компилятор if не запрещает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме