Выбор ответа Middle Потоки и Java Memory Model спрашивают часто обновлено

Флаг остановки без volatile

Вопрос

Поток крутится в while (!stop) { }, другой поток ставит stop = true. Поле stop обычное, не volatile. Что может случиться?

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

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

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

Коротко

Правильный ответ: Цикл может не завершиться никогда: JIT вправе вынести чтение поля из цикла. Без happens-before между записью и чтением JMM не гарантирует видимость.

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

  1. Цикл гарантированно завершится, но с задержкой до миллисекунды на синхронизацию кешей
  2. JVM бросит IllegalMonitorStateException при чтении поля без монитора
  3. Цикл может не завершиться никогда: JIT вправе вынести чтение поля из циклаправильный ответ
  4. Ничего страшного: запись в boolean всегда атомарна и сразу видна всем

Разбор

Без happens-before между записью и чтением JMM не гарантирует видимость. JIT может превратить цикл в if (!stop) while (true) {}, и такой поток повиснет навсегда. Атомарность записи boolean есть, но атомарность не равна видимости. Решение: volatile boolean stop или AtomicBoolean. IllegalMonitorStateException бросает wait/notify без монитора.

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

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

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