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

Double-checked locking без volatile

Вопрос

Почему DCL-синглтон без volatile у поля instance некорректен?

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

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

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

Коротко

Правильный ответ: Другой поток может увидеть ссылку на объект, поля которого ещё не записаны. Первая проверка instance == null идёт без синхронизации.

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

  1. Два потока могут одновременно создать два экземпляра внутри synchronized
  2. Другой поток может увидеть ссылку на объект, поля которого ещё не записаныправильный ответ
  3. Без volatile synchronized-блок не работает и пропускает два потока сразу
  4. JVM запрещает статические поля без volatile в многопоточном коде

Разбор

Первая проверка instance == null идёт без синхронизации. Запись ссылки и запись полей объекта могут быть переупорядочены, поэтому поток, не входящий в synchronized, может получить объект в недостроенном состоянии. volatile создаёт happens-before между записью и чтением ссылки. Внутри synchronized второй экземпляр не создастся благодаря второй проверке. Альтернативы: holder-класс или enum.

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

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

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