<div> JavaScript is disabled on your browser.
Skip navigation links
Java™ Platform
Standard Ed. 8
compact3

Package java.util.concurrent.atomic

一个支持单变量无锁线程安全编程的类的小工具包。

See: 描述

Package java.util.concurrent.atomic Description

一个支持单变量无锁线程安全编程的类的小工具包。在本质上,这个包的类扩展 volatile值的概念领域,和数组元素的同时也提供了一个原子条件的更新操作形式:
 boolean compareAndSet(expectedValue, updateValue);

这种方法(在参数类型在不同类别而异)自动设置一个变量的updateValue如果目前持有的expectedValue,报告true成功。在这个包中的类还包含方法得到无条件的设定值,以及一个较弱的条件weakCompareAndSet原子更新操作如下。

这些方法的规格使实现采用高效的机器级的原子指令,可在当代处理器。然而在一些平台上,支持可能需要某种形式的内部锁定。因此,该方法不严格保证是非阻塞-一个线程可能会阻塞瞬时执行之前的操作。

类的实例AtomicBooleanAtomicIntegerAtomicLong,和AtomicReference每个提供相应类型的一个变量的访问和更新。每个类也为该类型提供适当的实用方法。例如,类AtomicLongAtomicInteger提供原子增量方法。一个应用程序是生成序列号,如:


 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)

除了代表单值的类,这个包中包含更新的类,可以用来获得在任何选定的volatile领域的任何选定的类compareAndSet操作。AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdater,和AtomicLongFieldUpdater基础设施提供相关的字段类型的思考。这些主要是使用在同一节点的若干volatile场原子数据结构(例如,一个树节点的链接)是独立主体的原子更新。这些类使更大的灵活性,在如何和何时使用原子的更新,在牺牲更尴尬的反射为基础的设置,不太方便的使用,和较弱的保证。

AtomicIntegerArrayAtomicLongArray,和AtomicReferenceArray类进一步扩展了原子操作支持这些类型的数组。这些课程是为他们提供volatile访问数组元素的语义也值得注意,这不是普通的阵列支持。

原子类还支持方法weakCompareAndSet,具有有限的适用性。在一些平台上,弱版本可能比正常情况下compareAndSet更有效,但不同的是,任何给定的weakCompareAndSet方法调用返回false不合逻辑的(即,没有明显的原因)。一个false回报仅仅意味着可以重试操作如果需要,依托保证重复调用时变量保存expectedValue和没有其他线程也试图设置变量最终会成功。(这种虚假的失败可能由于内存竞争的影响无关,是否达到预期的电流值相等。)此外weakCompareAndSet不提供顺序保证通常需要同步控制。然而,该方法可能是有用的更新计数器和统计等更新到其他无关程序序发生之前。当一个线程看到一条由weakCompareAndSet引起原子变量的更新,不看任何其他变量在weakCompareAndSet发生更新。这可能是可以接受的,例如,更新性能统计,但很少有其他。

AtomicMarkableReference类将一个参考单布尔。例如,这个位可以在数据结构中使用,这意味着被引用的对象在逻辑上被删除了。的AtomicStampedReference类将提供一个整型值。这可能是使用的例子,代表对应于一系列更新的版本号。

原子类的设计主要是用于实现非阻塞的数据结构和相关的基础设施类的构建块。的compareAndSet方法不锁定一般更换。它仅适用于当一个对象的关键更新被限制在一个单一的变量。

原子类不java.lang.Integer及相关类通用的替代品。他们不确定方法如equalshashCodecompareTo。(因为原子变量被预期会发生突变,它们是哈希表键的差选择。)此外,类只为那些在预期应用中常用的类型提供了。例如,有没有代表byte原子类。在那些罕见的情况下,你想这么做的话,你可以使用一个AtomicInteger举行byte值,和适当地投。你也可以使用Float.floatToRawIntBits(float)举行花车和Float.intBitsToFloat(int)转换和双打使用Double.doubleToRawLongBits(double)Double.longBitsToDouble(long)转换。

从以下版本开始:
1.5
Skip navigation links
Java™ Platform
Standard Ed. 8

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.

本帮助文档是使用 《百度翻译》翻译,请与英文版配合使用 by--QQ:654638585