Volatile boolean vs AtomicBoolean
Классы Atomic * обертывают летучий примитив того же типа.Из источника:
public class AtomicLong extends Number implements java.io.Serializable {
...
private volatile long value;
...
public final long get() {
return value;
}
...
public final void set(long newValue) {
value = newValue;
}
Так что, если все, что вы делаете - это получаете и устанавливаете Atomic *, то вместо этого вы можете просто иметь изменяемое поле.
Что такое AtomicBooleanсделать то, чего не может достичь энергозависимое логическое значение?
Атомные * классы предоставляют вам методы, которые предоставляют более продвинутые функциональные возможности, такие как incrementAndGet()
, compareAndSet()
и другие, которые реализуют несколько операций (get / increment / set, тест / комплект) без блокировки.Вот почему классы Atomic * такие мощные.
Например, если несколько потоков используют следующий код, использующий ++
, будут условия гонки, потому что ++
на самом деле: get, increment и set.
private volatile value;
...
// race conditions here
value++;
Тем не менее, следующий код будет работать безопасно в многопоточной среде без блокировок:
private final AtomicLong value = new AtomicLong();
...
value.incrementAndGet();
Также важно отметить, что перенос вашего энергозависимого поля с использованием класса Atomic *хороший способ инкапсулировать критический общий ресурс с точки зрения объекта.Это означает, что разработчики не могут просто иметь дело с полем, предполагая, что оно не является общим, что может привести к проблемам с полем ++;или другой код, который вводит условия гонки.