«Атомные» объекты не являются неизменяемыми, поэтому они должны быть поточно-ориентированными, только если они опубликованы должным образом. Например, когда вы делаете что-то подобное, вам нужно использовать ключевое слово volatile.
volatile AtomicInteger counter = // initialize counter
int harvest(){
AtomicInteger old = counter;
counter = new AtomicInteger();
return old.get();
}
Если вы удалите volatile из приведенного выше кода, вы действительно можете потерять некоторые приращения. Согласно спецификации, вы также можете получить ссылку на объект AtomicInteger, который не полностью сконструирован, и, таким образом, получить неопределенное поведение.
Итак, вам нужно объявить свой атомарный объект как энергозависимый? Ответ зависит. Они являются потокобезопасными только в том случае, если они опубликованы должным образом, как и любые другие потоковобезопасные объекты (за исключением неизменяемых объектов, которые являются особым случаем). В большинстве случаев вы должны сделать их окончательными.