| 类 | 描述 |
|---|---|
| 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.