Spec-Zone .ru
спецификации, руководства, описания, API
|
java.util.concurrent.atomic
пакет определяет классы, которые поддерживают атомарные операции на единственных переменных. Все классы имеют get
и set
методы, которые работают как чтения и записи на volatile
переменные. Таким образом, a set
имеет происхождение - перед отношением с любым последующим get
на той же самой переменной. Атомарное compareAndSet
у метода также есть эти функции непротиворечивости памяти, также, как и простые атомарные арифметические методы, которые применяются к целочисленным атомарным переменным.
Чтобы видеть, как этот пакет мог бы использоваться, давайте возвратимся к
class мы первоначально имели обыкновение демонстрировать интерференцию потока:Counter
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(); } }