Действительно ли изменчивая ссылка действительно гарантирует, что внутреннее состояние объекта видимо другим потокам?
Читая "Параллелизм Java на практике", я обнаружил следующее:
Чтобы безопасно опубликовать объект, и ссылка на объект, и состояние объекта должны быть видны другим потокам одновременно. Правильно сконструированный объект может быть безопасно опубликован:
- Инициализация ссылки на объект из статического инициализатора;
- Сохранение ссылки на него в энергозависимом поле или AtomicReference;
- Сохранение ссылки на него в конечном поле правильно построенного объекта; или же
- Сохранение ссылки на него в поле, которое должным образом охраняется блокировкой.
Мой вопрос - верен ли второй пункт? Т.е. можно ли сделать состояние объекта видимым для других потоков, просто сохранив ссылку на него в энергозависимой ссылке? Если нет, то правильно ли я читаю вышеуказанные пункты?
1 ответ
Создание объекта изменчивым не делает его состояние опубликованным во всех потоках, т.е.
volatile A a = new A();
private static class A {
int i = 0;
int j = 0;
int k = 0;
}
это не то же самое, что
A a = new A();
private static class A {
volatile int i = 0;
volatile int j = 0;
volatile int k = 0;
}
(1) скорее делает вашу ссылку изменчивой, т.е. если один поток переназначает ссылку, это переназначение будет немедленно "опубликовано" другим потокам