Нужно ли объявлять AtomicReference как изменчивый? - PullRequest
5 голосов
/ 12 августа 2011

То же самое для всех других атомных объектов?Проще объяснить вопрос для AtomicInteger.Поскольку более одного потока обращаются к ссылке на myInt, разве не возможно, что один поток видит зарегистрированное кэшированное значение, например, null, для этого объекта, если только оно не объявлено как volatile?Если нет, то как?

Ответы [ 2 ]

9 голосов
/ 12 августа 2011

Мало того, что это не нужно, это фактически семантически неправильно.AtomicReference содержит «реальную» ссылку внутри себя и управляет доступом к ней, используя свои собственные конструкции синхронизации.Собственные конструкции синхронизации JVM (synchronized, volatile и т. Д.) Не используются.Сам объект AtomicReference не должен рассматриваться как изменчивый.Во всяком случае, рассмотрите возможность сделать это final.

Также рассмотрите этот вопрос - volatile можно рассматривать как альтернативу использованию AtomicReference, если все, что вам нужно, это получитьоперации над множествами.

2 голосов
/ 12 августа 2011

«Атомные» объекты не являются неизменяемыми, поэтому они должны быть поточно-ориентированными, только если они опубликованы должным образом. Например, когда вы делаете что-то подобное, вам нужно использовать ключевое слово volatile.

volatile AtomicInteger counter = // initialize counter

int harvest(){
    AtomicInteger old = counter;
    counter = new AtomicInteger();
    return old.get();
}

Если вы удалите volatile из приведенного выше кода, вы действительно можете потерять некоторые приращения. Согласно спецификации, вы также можете получить ссылку на объект AtomicInteger, который не полностью сконструирован, и, таким образом, получить неопределенное поведение.

Итак, вам нужно объявить свой атомарный объект как энергозависимый? Ответ зависит. Они являются потокобезопасными только в том случае, если они опубликованы должным образом, как и любые другие потоковобезопасные объекты (за исключением неизменяемых объектов, которые являются особым случаем). В большинстве случаев вы должны сделать их окончательными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...