# 原子变量

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html)

[`java.util.concurrent.atomic`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html) 包定义了支持单个变量的原子操作的类。所有类都有`get`和`set`方法，类似于`volatile`变量的读写操作。也就是说，`set`与同一变量上的任何后续`get`具有先发生关系。原子`compareAndSet`方法也具有这些内存一致性特征，适用于整数原子变量的简单原子算法也是如此。

要了解如何使用此包，让我们返回到我们最初用于演示线程干扰的 [``Counter``](examples/Counter.java)类：

```
class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }

}

```

使`Counter`免受线程干扰的一种方法是使其方法同步，如 [``SynchronizedCounter``](examples/SynchronizedCounter.java)：

```
class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }

}

```

对于这个简单的类，同步是可接受的解决方案。但是对于更复杂的类，我们可能希望避免不必要的同步对活动的影响。用`AtomicInteger`替换`int`字段允许我们在不诉诸同步的情况下防止线程干扰，如 [``AtomicCounter``](examples/AtomicCounter.java)：

```
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();
    }

}

```