Действительно ли изменчивая ссылка действительно гарантирует, что внутреннее состояние объекта видимо другим потокам?

Читая "Параллелизм 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) скорее делает вашу ссылку изменчивой, т.е. если один поток переназначает ссылку, это переназначение будет немедленно "опубликовано" другим потокам

Другие вопросы по тегам