Java原子类简述
一、概述
java的java.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。
Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。
二、原子类底层实现
| 原子类 | 类型 |
|---|---|
| Unsafe | 魔法类 |
三、常用的原子类

3.1 基本类型
使用原子的方式更新基本类型
| 原子类 | 类型 |
|---|---|
| AtomicInteger | 整形原子类 |
| AtomicLong | 长整型原子类 |
| AtomicBoolean | 布尔型原子类 |
3.2 引用类型
| 原子类 | 类型 |
|---|---|
| AtomicReference | 引用类型原子类 |
| AtomicStampedReference | 原子更新引用类型里的字段原子类 |
| AtomicMarkableReference | 原子更新带有标记位的引用类型 |
ABA问题
AtomicStampedReference和AtomicMarkableReference这两个原子类可以解决ABA问题。
AtomicStampedReference该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。
3.3 数组类型
| 原子类 | 类型 |
|---|---|
| AtomicIntegerArray | 整形数组原子类 |
| AtomicLongArray | 长整形数组原子类 |
| AtomicReferenceArray | 引用类型数组原子类 |
这些类提供的方法和原子化的基本数据类型的区别仅仅是:每个方法多了一个数组的索引参数,所以这里也不再赘述了。
3.4 更新器
| 原子类 | 类型 |
|---|---|
| AtomicIntegerFieldUpdater | 原子更新整形的更新器 |
| AtomicLongFieldUpdater | 原子更新长整形的更新器 |
| AtomicReferenceFieldUpdater | 原子更新引用的更新器 |
利用它们可以原子化地更新对象的属性,这三个方法都是利用反射机制实现的。
3.5 累加器
| 原子类 | 类型 |
|---|---|
| DoubleAccumulator | 原子更新整形字段的累加器 |
| DoubleAdder | 原子更新整形字段的加法器 |
| LongAccumulator | 原子更新长整形字段的累加器 |
| LongAdder | 原子更新长整形字段的加法器 |
LongAccumulator是LongAdder的功能增强版,LongAdder的API只有对数值的加减,而LongAccumulator提供了自定义的函数操作。
这四个类仅仅用来执行累加操作,相比原子化的基本数据类型,速度更快,但是不支持compareAndSet()方法。如果仅仅需要累加操作,使用原子化的累加器性能会更好

浙公网安备 33010602011771号