2016-03-24 3 views
0

Во время чтения «Java Параллелизм на практике», я наткнулся на следующее -Действительно ли волатильная ссылка действительно гарантирует, что внутреннее состояние объекта видимо для других потоков?

Чтобы опубликовать объект безопасно, как ссылка на объект и состояние объекта должны быть сделаны видимыми для других потоков одновременно. Правильно построенный объект можно безопасно опубликовать:

  • Инициализация ссылки на объект из статического инициализатора;
  • Хранение ссылки на него в поле volatile или AtomicReference;
  • Хранение ссылки на него в конечном поле правильно построенного объекта; или
  • Хранение ссылки на него в поле, которое должным образом защищено блокировкой.

Мой вопрос - это второй вопрос? То есть Могу ли я сделать состояние объекта видимым для других потоков, просто сохраняя ссылку на него во взрывоопасной ссылке? Если нет, я неправильно читаю вышеуказанные пункты?

+0

Вы понимаете, что означает «безопасно опубликованное» в этом контексте? –

+1

http://stackoverflow.com/q/801993/139010 –

+1

По моему мнению (с удовольствием исправлено) это означает, что поток чтения должен иметь возможность видеть правильные значения членов этого объекта (правильные значения - значения, которые были назначены членам в конструкторе этого объекта) –

ответ

0

Создание объекта летучий не делает его состояние опубликовано ко всем потокам, т.е.

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

+0

Спасибо за ответ! По-видимому, даже если эта ссылка нестабильна, этого достаточно. Любой поток, который читает ссылку, также увидит любые записи, которые были сделаны ПЕРЕД НАСТРОЙКОЙ volatile reference (при условии, что другие записи были сделаны тем же потоком, который установил волатильную ссылку) –

Смежные вопросы