Java 中的 13 个原子操作类
Java 中的 13 个原子操作类
原子更新基本类型类
- AtomicBoolean:原子更新布尔类型。
- AtomicInteger:原子更新整型。
int addAndGet(int delta)
:以原子方式将输入的数值与实例中的值(AtomicInteger
里的value
)相加。int getAndIncrement()
:以原子方式将当前值加 1,注意,这里返回的是自增前的值。void lazySet(int newValue)
:最终会设置成newValue
,使用lazySet
设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。int getAndSet(int newValue)
:以原子方式设置为newValue
的值,并返回旧值。
- AtomicLong:原子更新长整型。
Atomic 包里的类基本都是使用 Unsafe 实现的
Unsafe
只提供了 3 种 CAS 方法:compareAndSwapObject
、compareAndSwapInt
和compareAndSwapLong
。- 看
AtomicBoolean
源码,发现它是先把Boolean
转换成整型,再使用compareAndSwapInt
进行 CAS。因此,原子更新char
、float
和double
变量也可以用类似的思路来实现。
原子更新数组
- AtomicIntegerArray:原子更新整型数组里的元素。
int addAndGet(int i, int delta)
:以原子方式将输入值与数组中索引i
的元素相加。boolean compareAndSet(int i, int expect, int update)
:如果当前值等于预期值,则以原子方式将数组位置i
的元素设置成update
值。
- AtomicLongArray:原子更新长整型数组里的元素。
- AtomicReferenceArray:原子更新引用类型数组里的元素。
原子更新引用类型
- AtomicReference:原子更新引用类型。
- AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
- AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。
原子更新字段类
- AtomicIntegerFieldUpdater:原子更新整型字段的更新器。
- AtomicLongFieldUpdater:原子更新长整型字段的更新器。
- AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment