Java原子类简述

一、概述

javajava.util.concurrent包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于java.util.concurrent.atomic包。

Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。

二、原子类底层实现

原子类 类型
Unsafe -

三、常用的原子类

3.1 基本类型

使用原子的方式更新基本类型

原子类 类型
AtomicInteger 整形原子类
AtomicLong 长整型原子类
AtomicBoolean 布尔型原子类

3.2 引用类型

原子类 类型
AtomicReference 引用类型原子类
AtomicStampedReference 原子更新引用类型里的字段原子类
AtomicMarkableReference 原子更新带有标记位的引用类型

ABA问题

AtomicStampedReferenceAtomicMarkableReference这两个原子类可以解决ABA问题。

AtomicStampedReference该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。

3.3 数组类型

原子类 类型
AtomicIntegerArray 整形数组原子类
AtomicLongArray 长整形数组原子类
AtomicReferenceArray 引用类型数组原子类

这些类提供的方法和原子化的基本数据类型的区别仅仅是:每个方法多了一个数组的索引参数,所以这里也不再赘述了。

3.4 更新器

原子类 类型
AtomicIntegerFieldUpdater 原子更新整形的更新器
AtomicLongFieldUpdater 原子更新长整形的更新器
AtomicReferenceFieldUpdater 原子更新引用的更新器

利用它们可以原子化地更新对象的属性,这三个方法都是利用反射机制实现的。

3.5 累加器

原子类 类型
DoubleAccumulator 原子更新整形字段的累加器
DoubleAdder 原子更新整形字段的累加器
LongAccumulator 原子更新长整形字段的累加器
LongAdder 原子更新长整形字段的累加器

LongAccumulatorLongAdder的功能增强版,LongAdderAPI只有对数值的加减,而LongAccumulator提供了自定义的函数操作。

这四个类仅仅用来执行累加操作,相比原子化的基本数据类型,速度更快,但是不支持compareAndSet()方法。如果仅仅需要累加操作,使用原子化的累加器性能会更好

参考文章

posted @ 2022-06-20 22:55  夏尔_717  阅读(295)  评论(0编辑  收藏  举报