|
Spec-Zone .ru
спецификации, руководства, описания, API
|
java.util.concurrent.atomic пакет определяет классы, которые поддерживают атомарные операции на единственных переменных. Все классы имеют get и set методы, которые работают как чтения и записи на volatile переменные. Таким образом, a set имеет происхождение - перед отношением с любым последующим get на той же самой переменной. Атомарное compareAndSet у метода также есть эти функции непротиворечивости памяти, также, как и простые атомарные арифметические методы, которые применяются к целочисленным атомарным переменным.
Чтобы видеть, как этот пакет мог бы использоваться, давайте возвратимся к
class Counter {
private int c = 0;
public void increment() {
c++;
}
public void decrement() {
c--;
}
public int value() {
return c;
}
}
Один способ сделать Counter безопасный от интерференции потока должен сделать ее методы синхронизируемыми, как в :SynchronizedCounter
class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
Для этого простого class синхронизация является приемлемым решением. Но для более сложного class, мы могли бы хотеть избежать живого воздействия ненужной синхронизации. Замена int поле с AtomicInteger позволяет нам предотвращать интерференцию потока, не обращаясь к синхронизации, как в :AtomicCounter
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
}