模块 java.base

包 java.util.concurrent.atomic


java.util.concurrent.atomic
支持对单个变量进行无锁线程安全编程的小型类工具包。原子类的实例维护使用相关方法访问和更新的值,否则可用于使用关联原子操作的字段。

AtomicBoolean AtomicInteger AtomicLong AtomicReference 类的实例均提供对相应类型的单个变量的访问和更新。每个类还为该类型提供适当的实用方法。例如,类 AtomicLongAtomicInteger 提供原子增量方法。一种应用是生成序列号,如:

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

包含值的任意转换由低级读取-修改-写入操作(如 compareAndSet)和高级方法(如 getAndUpdate)提供。

这些类不是 java.lang.Integer 和相关类的通用替代品。他们确实 not 定义了诸如 equalshashCode compareTo 之类的方法。因为预期原子变量会发生变化,所以它们不是哈希表键的糟糕选择。

AtomicIntegerArray AtomicLongArray AtomicReferenceArray 类进一步将原子操作支持扩展到这些类型的数组。这些类在为其数组元素提供volatile 访问语义方面也很引人注目。

除了表示单个值和数组的类之外,此包还包含 Updater 类,可用于获取 compareAndSet 以及对任何选定类的任何选定 volatile 字段的相关操作。这些类早于 VarHandle 的引入,并且用途更有限。 AtomicReferenceFieldUpdater AtomicIntegerFieldUpdater AtomicLongFieldUpdater 是基于反射的实用程序,可提供对关联字段类型的访问。这些主要用于原子数据结构,其中同一节点的几个volatile字段(例如,树节点的链接)独立地进行原子更新。这些类在如何以及何时使用原子更新方面提供了更大的灵活性,但代价是基于反射的设置更笨拙、使用更不方便且保证更弱。

AtomicMarkableReference 类将单个boolean与引用相关联。例如,该位可能在数据结构中使用,表示被引用的对象在逻辑上已被删除。 AtomicStampedReference 类将整数值与引用相关联。例如,这可以用来表示对应于一系列更新的版本号。

自从:
1.5
  • 描述
    可以自动更新的 boolean 值。
    可以自动更新的 int 值。
    一个 int 数组,其中的元素可以自动更新。
    一种基于反射的实用程序,可以对指定类的指定 volatile int 字段进行原子更新。
    可以自动更新的 long 值。
    一个 long 数组,其中的元素可以自动更新。
    一种基于反射的实用程序,可以对指定类的指定 volatile long 字段进行原子更新。
    AtomicMarkableReference 维护一个对象引用和一个标记位,可以自动更新。
    可以自动更新的对象引用。
    一个对象引用数组,其中的元素可以自动更新。
    一种基于反射的实用程序,可以对指定类的指定 volatile 引用字段进行原子更新。
    AtomicStampedReference 维护一个对象引用以及一个可以自动更新的整数“戳记”。
    一个或多个变量共同维护使用提供的函数更新的运行 double 值。
    一个或多个变量一起保持最初为零的 double 总和。
    一个或多个变量共同维护使用提供的函数更新的运行 long 值。
    一个或多个变量一起保持初始为零的 long 总和。