类 | 描述 |
---|---|
AtomicBoolean |
一个
boolean 值可自动更新。
|
AtomicInteger |
一个
int 值可自动更新。
|
AtomicIntegerArray |
中的元素可以被更新的
int 原子阵列。
|
AtomicIntegerFieldUpdater<T> |
一种基于反射的效用,使原子更新指定
volatile int 字段指定的类。
|
AtomicLong |
一个
long 值可自动更新。
|
AtomicLongArray |
中的元素可以被更新,原子
long 阵列。
|
AtomicLongFieldUpdater<T> |
一种基于反射的效用,使原子更新指定
volatile long 字段指定的类。
|
AtomicMarkableReference<V> |
一个
AtomicMarkableReference 保持与标志位一个对象的引用,可以自动更新。
|
AtomicReference<V> |
一个对象的引用,可以自动更新。
|
AtomicReferenceArray<E> |
数组的对象引用的元素可以自动更新。
|
AtomicReferenceFieldUpdater<T,V> |
一种基于反射的效用,使原子更新指定
volatile 参考字段指定的类。
|
AtomicStampedReference<V> |
一个
AtomicStampedReference 保持随着整数“邮票”一个对象的引用,可以自动更新。
|
DoubleAccumulator |
一个或多个变量共同保持运行
double 值更新,使用提供的功能。
|
DoubleAdder |
一个或多个变量一起保持最初的零
double 总和。
|
LongAccumulator |
一个或多个变量共同保持运行
long 值更新,使用提供的功能。
|
LongAdder |
一个或多个变量一起保持最初的零
long 总和。
|
volatile
值的概念领域,和数组元素的同时也提供了一个原子条件的更新操作形式:
boolean compareAndSet(expectedValue, updateValue);
这种方法(在参数类型在不同类别而异)自动设置一个变量的updateValue
如果目前持有的expectedValue
,报告true
成功。在这个包中的类还包含方法得到无条件的设定值,以及一个较弱的条件weakCompareAndSet
原子更新操作如下。
这些方法的规格使实现采用高效的机器级的原子指令,可在当代处理器。然而在一些平台上,支持可能需要某种形式的内部锁定。因此,该方法不严格保证是非阻塞-一个线程可能会阻塞瞬时执行之前的操作。
类的实例AtomicBoolean
,AtomicInteger
,AtomicLong
,和AtomicReference
每个提供相应类型的一个变量的访问和更新。每个类也为该类型提供适当的实用方法。例如,类AtomicLong
和AtomicInteger
提供原子增量方法。一个应用程序是生成序列号,如:
class Sequencer {
private final AtomicLong sequenceNumber
= new AtomicLong(0);
public long next() {
return sequenceNumber.getAndIncrement();
}
}
这是简单的定义新的实用功能,如getAndIncrement
,申请一个函数值的原子。例如,给出了一些变换
long transform(long input)
写你的实用方法如下:
long getAndTransform(AtomicLong var) {
long prev, next;
do {
prev = var.get();
next = transform(prev);
} while (!var.compareAndSet(prev, next));
return prev; // return next; for transformAndGet
}
用于访问和更新原子通常遵循挥发物的规则的记忆效果,如在 The Java Language Specification (17.4 Memory Model):
get
已经阅读volatile
变量的记忆效应。set
有文字的记忆效应(分配)一个volatile
变量。lazySet
有文字的记忆效应(分配)一个volatile
变量除了它允许reorderings随后(而不是以前的)记忆行为本身不强加的重新排序的限制与普通non-volatile
写道。其他的使用情境中,lazySet
可当调零,对垃圾收集的缘故,参考,是永远不会再次访问。weakCompareAndSet
自动读取和写入一个变量有条件但不创建任何之前发生的顺序,所以没有提供保证相对于以前或以后的读和写的weakCompareAndSet
目标比其他任何变量。compareAndSet
和其他所有的读取和更新等操作getAndIncrement
有阅读和写作volatile
变量的记忆效应。除了代表单值的类,这个包中包含更新的类,可以用来获得在任何选定的volatile
领域的任何选定的类compareAndSet
操作。AtomicReferenceFieldUpdater
,AtomicIntegerFieldUpdater
,和AtomicLongFieldUpdater
基础设施提供相关的字段类型的思考。这些主要是使用在同一节点的若干volatile
场原子数据结构(例如,一个树节点的链接)是独立主体的原子更新。这些类使更大的灵活性,在如何和何时使用原子的更新,在牺牲更尴尬的反射为基础的设置,不太方便的使用,和较弱的保证。
的AtomicIntegerArray
,AtomicLongArray
,和AtomicReferenceArray
类进一步扩展了原子操作支持这些类型的数组。这些课程是为他们提供volatile
访问数组元素的语义也值得注意,这不是普通的阵列支持。
原子类还支持方法weakCompareAndSet
,具有有限的适用性。在一些平台上,弱版本可能比正常情况下compareAndSet
更有效,但不同的是,任何给定的weakCompareAndSet
方法调用返回false
不合逻辑的(即,没有明显的原因)。一个false
回报仅仅意味着可以重试操作如果需要,依托保证重复调用时变量保存expectedValue
和没有其他线程也试图设置变量最终会成功。(这种虚假的失败可能由于内存竞争的影响无关,是否达到预期的电流值相等。)此外weakCompareAndSet
不提供顺序保证通常需要同步控制。然而,该方法可能是有用的更新计数器和统计等更新到其他无关程序序发生之前。当一个线程看到一条由weakCompareAndSet
引起原子变量的更新,不看任何其他变量在weakCompareAndSet
发生更新。这可能是可以接受的,例如,更新性能统计,但很少有其他。
的AtomicMarkableReference
类将一个参考单布尔。例如,这个位可以在数据结构中使用,这意味着被引用的对象在逻辑上被删除了。的AtomicStampedReference
类将提供一个整型值。这可能是使用的例子,代表对应于一系列更新的版本号。
原子类的设计主要是用于实现非阻塞的数据结构和相关的基础设施类的构建块。的compareAndSet
方法不锁定一般更换。它仅适用于当一个对象的关键更新被限制在一个单一的变量。
原子类不java.lang.Integer
及相关类通用的替代品。他们不确定方法如equals
,hashCode
和compareTo
。(因为原子变量被预期会发生突变,它们是哈希表键的差选择。)此外,类只为那些在预期应用中常用的类型提供了。例如,有没有代表byte
原子类。在那些罕见的情况下,你想这么做的话,你可以使用一个AtomicInteger
举行byte
值,和适当地投。你也可以使用Float.floatToRawIntBits(float)
举行花车和Float.intBitsToFloat(int)
转换和双打使用Double.doubleToRawLongBits(double)
和Double.longBitsToDouble(long)
转换。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.