原子变量 CAS算法
JDK 1.5
之后java.util.concurrent.atomic
包下提供了常用的原子变量。
volatile
保证内存可见性。CAS (Compare-And-Swap)
算法保证数据的原子性。CAS
算法是硬件对于并发操作数共享数据的支持。CAS
包含三个操作数:内存值V
,预估值A
,更新值B
。当且仅当V == A
时,V = B
;否则不进行任何操作。
-
类
AtomicBoolean
、AtomicInteger
、AtomicLong
和AtomicReference
的实例各自提供对相应类型单个变量的访问和更新。每个类也为该类型提供适当的实用工具方法。 -
类
AtomicIntegerArray
、AtomicLongArray
和AtomicReferenceArray
类进一步扩展了原子操作,对这些类型的数组提供了支持。这些类在为其数组元素提供volatile
访问语义方面也引人注目,这对于普通数组来说是不受支持的。 -
核心方法:
boolean compareAndSet(expectedValue, updateValue)
。 -
示例:
import java.util.concurrent.atomic.AtomicInteger; public class TestAtomic { public static void main(String[] args) { Atomic atomic = new Atomic(); for (int i = 0; i < 10; i++) { new Thread(atomic).start(); } } } class Atomic implements Runnable{ // 不能保证数据的原子性 // private volatile int num = 0; // 使用原子变量 private AtomicInteger num = new AtomicInteger(); public int getNum() { return num.getAndIncrement(); } @Override public void run() { try { Thread.sleep(200); } catch (InterruptedException e) { } System.out.println(getNum()); } }