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()
方法。如果仅仅需要累加操作,使用原子化的累加器性能会更好