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

Безопасная публикация неизменяемого объекта

Вопрос

Объект с final-полями, присвоенными в конструкторе, записан в обычное (не volatile) поле и прочитан другим потоком. Что гарантирует JMM?

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

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

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

Коротко

Правильный ответ: Если this не утёк из конструктора, final-поля будут видны верными. Семантика final-полей в JMM: после завершения конструктора их значения видны любому потоку, получившему ссылку на объект, даже через data race.

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

  1. Ничего: без volatile другой поток может увидеть нули в final-полях
  2. Гарантирует видимость и final-полей, и обычных полей этого объекта
  3. Если this не утёк из конструктора, final-поля будут видны вернымиправильный ответ
  4. Гарантирует, что другой поток сразу увидит саму ссылку на объект

Разбор

Семантика final-полей в JMM: после завершения конструктора их значения видны любому потоку, получившему ссылку на объект, даже через data race. Поэтому неизменяемые объекты потокобезопасны без синхронизации. Гарантия касается только final-полей (и того, что достижимо через них), не обычных полей. И она не обещает, что ссылка вообще станет видна быстро: для этого нужен volatile или другая публикация.

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

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

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