Сделайте объект AtomicXXX изменчивым

Я прочитал некоторую информацию о изменчивых переменных и их аналогах AtomicXXX (например, AtomicBoolean).

Но бывают ли ситуации, когда мне нужно сделать сам объект AtomicXXX изменчивым, или в этом нет необходимости?


person Rox    schedule 11.11.2011    source источник


Ответы (2)


В этом нет необходимости - на самом деле атомарные объекты действительно должны быть установлены как final !!

Пример:

private final AtomicInteger atomicInt = new AtomicInteger(0);

private volatile int volatileInt = 0;

public void doStuff() {
  // To use the atomic int, you use the setters and getters!
  int gotAnInt = atomicInt.getAndIncrement();

  // To use a volatile, access and set it directly. 
  int gotAnotherInt = volatileInt;
  volatileInt = someOtherInt;
}
person Bringer128    schedule 11.11.2011
comment
Разве второе присвоение volatileInt (volatileInt = someOtherInt;) не включает чтение и запись и, таким образом, делает операцию не атомарной? - person Rox; 11.11.2011
comment
Ага, это правда. Извиняюсь за обратное - я удалю ссылку на атомарность! (К вашему сведению, само присвоение является атомарным, но чтение и запись не являются атомарными) - person Bringer128; 11.11.2011
comment
Значит, я должен синхронизировать метод doStuff (), чтобы сделать его атомарным? В тему: Итак, если AtomicXXX не объявлен окончательным, я теоретически должен объявить его как изменчивый, если он распределяется между разными потоками? - person Rox; 11.11.2011
comment
Нет - внутренняя часть класса AtomicInteger выполняет синхронизацию за вас. Вам не нужно делать ее изменчивой (и на самом деле, последняя изменчивая переменная не имеет смысла!) - person Bringer128; 11.11.2011

Прочтите this, чтобы получить некоторые советы и объяснения, когда использовать volatile. Но в основном, если вы используете AtomicXXX, вам НЕ НУЖНО использовать volatile.

person LordDoskias    schedule 11.11.2011