Java原子变量的诞生源自一个简单的需求 —— 多个线程共享某个变量或者对象时,需要对修改和读取操作进行同步。
同步包含两层含义:
- 互斥访问
- 可见性
通常,多线程对临界资源的互斥访问通过对象锁(synchronized关键字)保证。对象锁是一种独占锁(悲观锁),会导致其它所有需要锁的线程挂起。而可见性则由volatile的内存语义保证。
Java 1.5开始提供了原子变量和原子引用,这些类放置在java.util.concurrent
下。大概可以归为4类:
- 基本类型:AtomicInteger, AtomicLong, AtomicBoolean;
- 数组类型:AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray;
- 引用类型:AtomicReference, AtomicStampedReference, AtomicMarkableReference;
- 对象的属性修改类型:AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater;
Java原子变量的存在是为了对相应的数据进行原子操作。
所谓的原子操作包含下面几层含义:
- 操作过程不会被中断。
- 操作过程不会被阻塞。
- 修改结果被其他线程可见。