Package java.util.concurrent.atomic
VarHandle操作可访问和更新的值。
类AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference的实例分别提供对相应类型的单个变量的访问和更新。每个类还为该类型提供适当的实用方法。例如,类AtomicLong和AtomicInteger提供了原子递增方法。一个应用是生成序列号,如下所示:
class Sequencer {
private final AtomicLong sequenceNumber
= new AtomicLong(17);
public long next() {
return sequenceNumber.getAndIncrement();
}
}
通过低级读-修改-写操作(如compareAndSet)和高级方法(如getAndUpdate),可以对所包含值进行任意转换。
这些类不是java.lang.Integer及相关类的通用替代品。它们不定义诸如equals、hashCode和compareTo等方法。因为预期原子变量会被改变,所以它们不适合作为哈希表键。
AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray类进一步扩展了对这些类型数组的原子操作支持。这些类还以为它们的数组元素提供了volatile访问语义。
除了表示单个值和数组的类之外,该包还包含了可用于获取任选类的任选volatile字段上的compareAndSet和相关操作的Updater类。这些类早于VarHandle的引入,并且使用范围更有限。AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater和AtomicLongFieldUpdater是基于反射的实用工具,提供对关联字段类型的访问。这些主要用于具有多个相同节点的volatile字段(例如,树节点的链接)独立地受原子更新的原子数据结构中。这些类使得在何时以及如何使用原子更新更加灵活,但需要更繁琐的基于反射的设置、不太方便的使用和更弱的保证。
AtomicMarkableReference类将一个布尔值与一个引用关联起来。例如,这个位可能在数据结构内部表示被引用的对象已经逻辑上被删除。AtomicStampedReference类将一个整数值与一个引用关联起来。例如,可以用来表示与一系列更新对应的版本号。
- 自 JDK 1.5 起
- 1.5
-
ClassesClassDescription可以原子方式更新的
boolean值。可以原子方式更新的int值。可以原子方式更新的int数组。一种基于反射的实用工具,可以原子方式更新指定类的指定volatile int字段。可以原子方式更新的long值。可以原子方式更新的long数组。一种基于反射的实用工具,可以原子方式更新指定类的指定volatile long字段。AtomicMarkableReference维护一个对象引用以及一个标记位,可以原子方式更新。可以原子方式更新的对象引用。可以原子方式更新的对象引用数组。一种基于反射的实用工具,可以原子方式更新指定类的指定volatile引用字段。AtomicStampedReference维护一个对象引用以及一个整数“戳记”,可以原子方式更新。一个或多个变量,共同维护一个使用提供的函数更新的运行中的double值。一个或多个变量,共同维护一个最初为零的double总和。一个或多个变量,共同维护一个使用提供的函数更新的运行中的long值。一个或多个变量,共同维护一个最初为零的long总和。