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