Читая Java Параллелизм на практикеНеустойчивая гарантия безопасной публикации изменчивого объекта?
Я вижу:
Чтобы опубликовать объект безопасно, как ссылку на объект и состояние объекта должны быть сделаны видимыми для других потоков одновременно. Правильно построенный объект может быть безопасно опубликован:
- Инициализация ссылки на объект от статического инициализатора
- хранящим ссылки на него в летучее поле или AtomicReference
- Сохранение ссылки на него в конечное поле правильно спроектированного объекта
- Хранение ссылки на него в поле, которое должным образом защищено замком .
Однако я смущен о второй идиоме. Так как volatile
может только гарантировать, что ссылка видна другой темой, но у нее нет синхронизации конструкции объекта, которую она ссылается на. Итак, как он может гарантировать правильное построение изменчивого объекта, то, что поток, который создает этот объект, прерывается другим потоком?
Что, если переменная является ссылкой на массив? например, volatile int [] arr = new int [5]. Я знаю, что arr будет опубликован безопасно, как насчет после публикации, я делаю arr [0] = 100. Является ли этот поток безопасным? Я хочу сказать, что это гарантирует безопасную публикацию arr [0] = 100? –
@GuifanLi Способ, которым я знаю/понимаю, нет гарантии на содержимое созданного экземпляра (или массива) после публикации. Возможно, я ошибаюсь (и немного занят на данный момент, чтобы найти ответ). –