из книги Java параллелизма на практике:финал против летучего guaranntee w.rt к безопасной публикации объектов
Чтобы опубликовать объект безопасно, как ссылки на объект и состояние в объекта должны быть сделаны видимо другие темы одновременно. правильно построенный объект может быть безопасно опубликовано:
Инициализация ссылки на объект от статического инициализатора
хранящего ссылку на него в летучее поле или AtomicReference
хранящема ссылка на него в окончательное поле правильно построенного объекта
St ссылаясь на него в поле, которое должным образом защищено замком
.
Мои вопросы:
- Каковы различия между пулевыми пунктами 2 и 3? Меня интересует разница между
volatile
подхода иfinal
подход с точки зрения безопасной публикации объекта. - Что он подразумевает под конечным полем правильно построенного объекта в пункте 3? Прежде чем начинать маркированные точки, авторы уже упомянули, что они говорят о правильно построенном объекте (который, я полагаю, не позволяет ссылаться на ссылку
this
). Но еще раз, почему они упоминали о правильно построенных объектах?
Если после построения я изменяю состояние объекта, на которое ссылается поле, например 'field.setX (new X())', является ли это изменение также гарантированным для просмотра другими потоками, когда мы объявляем его изменчивым? Или это только обеспечивает безопасность инициализации? А как насчет финала в этом случае? – Geek
Нет, только «поле» дает вам гарантию видимости при (пере) назначении. Если 'x' также нестабилен,' field.x = new X(); '(или ваш пример сеттера) не дает такой гарантии. – assylias
То же самое касается финала, и следствие состоит в том, что если все члены «поля» являются окончательными и неизменяемы, «поле» является неизменным и, следовательно, является потокобезопасным. – assylias