Java从JDK 1.5开始提供了java.util.concurrent.atomic包 (以下简称Atomic包) , 这个包中 的原子操作类提供了一种用法 简单 、 性能高效 、线程安全地更新一个变量的方式 。 因为变量的类型有很多种, 所以在Atomic包里一共提供了13个类, 属于4种类型的原子更 新方式, 分别是原子更新基本类型 、 原子更新数组 、 原子更新引用和原子更新属性 (字段) 。 Atomic包里的类基本都是使用Unsafe实现的包装类。
atomic 提供了 3 个类用于原子更新基本类型: 分别是 AtomicInteger 原子更新整形, AtomicLong 原子更新长整 形, AtomicBoolean 原子更新 bool 值。
atomic 里提供了三个类用于原子更新数组里面的元素, 分别是: AtomicIntegerArray: 原子更新整形数组里的元 素; AtomicLongArray: 原子更新长整形数组里的元素; AtomicReferenceArray: 原子更新引用数组里的元素。
原子更新基本类型的 AtomicInteger 只能更新一个变量, 如果要原子更新多个变量, 就需要使用原子更新引用类 型提供的类了 。原子引用类型 atomic 包主要提供了以下几个类: AtomicReference: 原子更新引用类型 ; AtomicReferenceFieldUpdater: 原子更新引用类型里的字段; AtomicMarkableReference: 原子更新带有标记位的引用 类型 。 可以原子更新一个布尔类型的标记位和引用类型 。构造方法是 AtomicMarkableReference (V initialRef , booleaninitialMark) 。
如果需要原子更新某个对象的某个字段, 就需要使用原子更新属性的相关类, atomic 中提供了一下几个类用于原 子更新属性: AtomicIntegerFieldUpdater: 原子更新整形属性的更新器; AtomicLongFieldUpdater: 原子更新长整形的 更新器; AtomicStampedReference: 原子更新带有版本号的引用类型 。该类将整数值与引用关联起来, 可用于原子的更 新数据和数据的版本号, 可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。



