java.util.concurrent包分红了三个部分,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock。内容涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等等经常使用工具。java
搜索资源:http://blog.csdn.net/zhgflx/article/details/4485848
编程
AtomicInteger:数组
Java的多线程编程模型5--从AtomicInteger开始:http://blog.csdn.net/sunnydogzhou/article/details/6564396安全
AtomicReference<V>数据结构
AtomicReference与volatile的区别:http://www.dewen.org/q/9588多线程
API文档介绍:并发
类摘要 | |
---|---|
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 维护带有整数“标志”的对象引用,能够用原子方式对其进行更新。 |
类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将 volatile 值、字段和数组元素的概念扩展到那些也提供原子条件更新操做的类,其形式以下:app
boolean compareAndSet(expectedValue, updateValue);
若是此方法(在不一样的类间参数类型也不一样)当前保持 expectedValue,则以原子方式将变量设置为 updateValue,并在成功时报告 true。此包中的类还包含获取并没有条件设置值的方法,以及如下描述的较弱条件的原子更新操做 weakCompareAndSet。工具
这些方法的规范使实现可以使用当代处理器上提供的高效机器级别原子指令。可是在某些平台上,该支持可能须要某种形式的内部锁。于是,该方法不能严格保证不被阻塞 - 执行操做以前可能暂时阻塞线程。性能
类 AtomicBoolean
、AtomicInteger
、AtomicLong
和 AtomicReference
的实例各自提供对相应类型单个变量的访问和更新。每一个类也为该类型提供适当的实用工具方法。例如,类 AtomicLong 和 AtomicInteger 提供了原子增量方法。一个应用程序将按如下方式生成序列号:
class Sequencer { private final AtomicLong sequenceNumber = new AtomicLong(0); public long next() { return sequenceNumber.getAndIncrement(); } }
原子访问和更新的内存效果通常遵循如下可变规则,正如 The Java Language Specification, Third Edition (17.4 Memory Model) 中的声明:
除了包含表示单个值的类以外,此包还包含 Updater 类,该类可用于获取任意选定类的任意选定 volatile 字段上的 compareAndSet 操做。AtomicReferenceFieldUpdater
、AtomicIntegerFieldUpdater
和 AtomicLongFieldUpdater
是基于反射的实用工具,能够提供对关联字段类型的访问。它们主要用于原子数据结构中,该结构中同一节点(例如,树节点的连接)的几个 volatile 字段都独立受原子更新控制。这些类在如何以及什么时候使用原子更新方面具备更大的灵活性,但相应的弊端是基于映射的设置较为拙笨、使用不太方便,并且在保证方面也较差。
AtomicIntegerArray
、AtomicLongArray
和 AtomicReferenceArray
类进一步扩展了原子操做,对这些类型的数组提供了支持。这些类在为其数组元素提供 volatile 访问语义方面也引人注目,这对于普通数组来讲是不受支持的。
原子类也支持 weakCompareAndSet 方法,该方法具备受限制的适用性。在某些平台上,弱版本在正常状况下可能比 compareAndSet 更有效,但不一样的是 weakCompareAndSet 方法的任何给定调用可能意外 返回 false(即没有明确的缘由)。返回 false 仅意味着能够在须要时从新尝试操做,具体取决于重复执行调用的保证,当该变量保持 expectedValue 而且没有其余线程也在尝试设置该变量时,最终将得到成功。(例如,这样的虚假失败多是因为内存争用的结果,该争用与指望值和当前值是否相等无关)。 此外,weakCompareAndSet 不提供一般须要同步控制的排序保证。可是,在这样的更新与程序的其余 happen-before 排序不相关时,该方法可用于更新计数器和统计数据。当一个线程看到对 weakCompareAndSet 致使的原子变量的更新时,它不必定能看到在 weakCompareAndSet 以前发生的对任何其余 变量的更新。例如,在更新性能统计数据时,这也许能够接受,但其余状况几乎不能够。
AtomicMarkableReference
类将单个布尔值与引用关联起来。例如,能够在数据结构内部使用此位,这意味着引用的对象在逻辑上已被删除。AtomicStampedReference
类将整数值与引用关联起来。例如,这可用于表示与更新系列对应的版本号。
设计原子类主要用做各类构造块,用于实现非阻塞数据结构和相关的基础结构类。compareAndSet 方法不是锁的常规替换方法。仅当对象的重要更新限定于单个 变量时才应用它。
原子类不是 java.lang.Integer 和相关类的通用替换方法。它们不 定义诸如 hashCode 和 compareTo 之类的方法。(由于原子变量是可变的,因此对于哈希表键来讲,它们不是好的选择。)另外,仅为那些一般在预期应用程序中使用的类型提供类。例如,没有表示 byte 的原子类。这种状况不常见,若是要这样作,可使用 AtomicInteger 来保持 byte 值,并进行适当的强制转换。也可使用 Float.floatToIntBits 和 Float.intBitstoFloat 转换来保持 float 值,使用 Double.doubleToLongBits 和 Double.longBitsToDouble 转换来保持 double 值。