Module java.base

Package java.util.concurrent.atomic


package java.util.concurrent.atomic
一组支持在单个变量上进行无锁线程安全编程的类的小工具包。原子类的实例维护着通过使用关联原子VarHandle操作可访问和更新的值。

AtomicBooleanAtomicIntegerAtomicLongAtomicReference的实例分别提供对相应类型的单个变量的访问和更新。每个类还为该类型提供适当的实用方法。例如,类AtomicLongAtomicInteger提供了原子递增方法。一个应用是生成序列号,如下所示:

 
 class Sequencer {
   private final AtomicLong sequenceNumber
     = new AtomicLong(17);
   public long next() {
     return sequenceNumber.getAndIncrement();
   }
 }

通过低级读-修改-写操作(如compareAndSet)和高级方法(如getAndUpdate),可以对所包含值进行任意转换。

这些类不是java.lang.Integer及相关类的通用替代品。它们定义诸如equalshashCodecompareTo等方法。因为预期原子变量会被改变,所以它们不适合作为哈希表键。

AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray类进一步扩展了对这些类型数组的原子操作支持。这些类还以为它们的数组元素提供了volatile访问语义。

除了表示单个值和数组的类之外,该包还包含了可用于获取任选类的任选volatile字段上的compareAndSet和相关操作的Updater类。这些类早于VarHandle的引入,并且使用范围更有限。AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdaterAtomicLongFieldUpdater是基于反射的实用工具,提供对关联字段类型的访问。这些主要用于具有多个相同节点的volatile字段(例如,树节点的链接)独立地受原子更新的原子数据结构中。这些类使得在何时以及如何使用原子更新更加灵活,但需要更繁琐的基于反射的设置、不太方便的使用和更弱的保证。

AtomicMarkableReference类将一个布尔值与一个引用关联起来。例如,这个位可能在数据结构内部表示被引用的对象已经逻辑上被删除。AtomicStampedReference类将一个整数值与一个引用关联起来。例如,可以用来表示与一系列更新对应的版本号。

自 JDK 1.5 起
1.5
  • Classes
    Class
    Description
    可以原子方式更新的boolean值。
    可以原子方式更新的int值。
    可以原子方式更新的int数组。
    一种基于反射的实用工具,可以原子方式更新指定类的指定volatile int字段。
    可以原子方式更新的long值。
    可以原子方式更新的long数组。
    一种基于反射的实用工具,可以原子方式更新指定类的指定volatile long字段。
    AtomicMarkableReference维护一个对象引用以及一个标记位,可以原子方式更新。
    可以原子方式更新的对象引用。
    可以原子方式更新的对象引用数组。
    一种基于反射的实用工具,可以原子方式更新指定类的指定volatile引用字段。
    AtomicStampedReference维护一个对象引用以及一个整数“戳记”,可以原子方式更新。
    一个或多个变量,共同维护一个使用提供的函数更新的运行中的double值。
    一个或多个变量,共同维护一个最初为零的double总和。
    一个或多个变量,共同维护一个使用提供的函数更新的运行中的long值。
    一个或多个变量,共同维护一个最初为零的long总和。