Выбор ответа Senior Потоки и Java Memory Model обновлено
Безопасная публикация неизменяемого объекта
Вопрос
Объект с final-полями, присвоенными в конструкторе, записан в обычное (не volatile) поле и прочитан другим потоком. Что гарантирует JMM?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Если this не утёк из конструктора, final-поля будут видны верными. Семантика final-полей в JMM: после завершения конструктора их значения видны любому потоку, получившему ссылку на объект, даже через data race.
Варианты ответа
- Ничего: без volatile другой поток может увидеть нули в final-полях
- Гарантирует видимость и final-полей, и обычных полей этого объекта
- Если
thisне утёк из конструктора, final-поля будут видны вернымиправильный ответ - Гарантирует, что другой поток сразу увидит саму ссылку на объект
Разбор
Семантика final-полей в JMM: после завершения конструктора их значения видны любому потоку, получившему ссылку на объект, даже через data race. Поэтому неизменяемые объекты потокобезопасны без синхронизации. Гарантия касается только final-полей (и того, что достижимо через них), не обычных полей. И она не обещает, что ссылка вообще станет видна быстро: для этого нужен volatile или другая публикация.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.