Из книги Java concurrency на практике:
Чтобы безопасно опубликовать объект, и ссылка на объект, и его состояние должны быть видны другим потокам одновременно. Правильно сконструированный объект можно безопасно опубликовать:
Инициализация ссылки на объект из статического инициализатора
Сохранение ссылки на него в volatile поле или AtomicReference
Сохранение ссылки на него в конечном поле правильно построенного объекта
Сохранение ссылки на него в поле, которое должным образом защищено блокировкой
.
Мои вопросы:
- В чем разница между пунктами 2 и 3? Меня интересует разница между подходом
volatile
и подходомfinal
с точки зрения безопасной публикации объекта. - Что он имеет в виду под конечным полем правильно сконструированного объекта в пункте 3? Перед тем, как начать маркированные пункты, авторы уже упомянули, что они говорят о правильно сконструированном объекте (который, как я предполагаю, не позволяет ссылке
this
избежать ). Но опять же, почему они упомянули о правильно построенных объектах?