java.util.concurrent.atomic包定义了对单一变量进行原子操作的类。所有的类都提供了get和set方法,可以使用它们像读写volatile变量一样读写原子类。就是说,同一变量上的一个set操作对于任意后续的get操作存在happens-before关系。原子的compareAndSet方法也有内存一致性特点,就像应用到整型原子变量中的简单原子算法。
为了看看这个包如何使用,让我们返回到最初用于演示线程干扰的Counter类:
01 |
class Counter { |
02 |
private int c = 0 ; |
03 |
public void increment() { |
04 |
c++; |
05 |
} |
06 |
07 |
public void decrement() { |
08 |
c--; |
09 |
} |
10 |
11 |
public int value() { |
12 |
return c; |
13 |
} |
14 |
} |
使用同步是一种使Counter类变得线程安全的方法,如SynchronizedCounter:
01 |
class SynchronizedCounter { |
02 |
private int c = 0 ; |
03 |
public synchronized void increment() { |
04 |
c++; |
05 |
} |
06 |
public synchronized void decrement() { |
07 |
c--; |
08 |
} |
09 |
public synchronized int value() { |
10 |
return c; |
11 |
} |
12 |
} |
对于这个简单的类,同步是一种可接受的解决方案。但是对于更复杂的类,我们可能想要避免不必要同步所带来的活跃度影响。将int替换为AtomicInteger允许我们在不进行同步的情况下阻止线程干扰,如AtomicCounter:
01 |
import java.util.concurrent.atomic.AtomicInteger; |
02 |
class AtomicCounter { |
03 |
private AtomicInteger c = new AtomicInteger( 0 ); |
04 |
public void increment() { |
05 |
c.incrementAndGet(); |
06 |
} |
07 |
08 |
public void decrement() { |
09 |
c.decrementAndGet(); |
10 |
} |
11 |
12 |
public int value() { |
13 |
return c.get(); |