Выбор ответа Senior Потоки и Java Memory Model обновлено
Double-checked locking без volatile
Вопрос
Почему DCL-синглтон без volatile у поля instance некорректен?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Другой поток может увидеть ссылку на объект, поля которого ещё не записаны. Первая проверка instance == null идёт без синхронизации.
Варианты ответа
- Два потока могут одновременно создать два экземпляра внутри synchronized
- Другой поток может увидеть ссылку на объект, поля которого ещё не записаныправильный ответ
- Без volatile synchronized-блок не работает и пропускает два потока сразу
- JVM запрещает статические поля без volatile в многопоточном коде
Разбор
Первая проверка instance == null идёт без синхронизации. Запись ссылки и запись полей объекта могут быть переупорядочены, поэтому поток, не входящий в synchronized, может получить объект в недостроенном состоянии. volatile создаёт happens-before между записью и чтением ссылки. Внутри synchronized второй экземпляр не создастся благодаря второй проверке. Альтернативы: holder-класс или enum.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.