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 方法:compareAndSwapObjectcompareAndSwapIntcompareAndSwapLong
  • AtomicBoolean 源码,发现它是先把 Boolean 转换成整型,再使用 compareAndSwapInt 进行 CAS。因此,原子更新 charfloatdouble 变量也可以用类似的思路来实现。

原子更新数组

  • 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 问题。