Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
java.util.concurrent.atomic
包定义了支持单个变量的原子操作的类。所有类都有 get
和 set
方法,这些方法与 volatile
变量的读写操作类似。也就是说,set
与同一变量上的任何后续 get
具有 happens-before 关系。原子 compareAndSet
方法也具有这些内存一致性功能,适用于整数原子变量的简单原子算法也是如此。
要查看如何使用此包,让我们返回到我们最初用于演示线程干扰的
类: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; } }
对于这个简单的类,同步是可接受的解决方案。但是对于更复杂的类,我们可能希望避免不必要的同步对活跃度的影响。用 AtomicInteger
替换 int
字段允许我们在不进行同步的情况下防止线程干扰,如
: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(); } }