今天来学习JUC原子类。JUC原子类位于java.util.concurrent.atomic包下,支持在单个变量上解除锁的线程安全编程。
参考JDK1.8的java.util.concurrent.atomic包,画出如下图:
可以将包中的类分为五类:
- 基本类型:AtomicBoolean、AtomicInteger、AtomicLong
- 引用类型:AtomicReference、AtomicStampedRerence、AtomicMarkableReference
- 数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- 对象的属性:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
- JDK1.8新增:DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder
AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference的实例各自提供对相应类型单个变量的原子方式访问和更新功能。例如AtomicBoolean提供对int类型单个变量的原子方式访问和更新功能。
每个类也为该类型提供适当的实用工具方法。例如,类AtomicLong和AtomicInteger提供了原子增量方法,可以用于生成序列号。
AtomicStampedRerence维护带有整数“标志”的对象引用,可以用原子方式对其进行更新。AtomicMarkableReference维护带有标记位的对象引用,可以原子方式对其进行更新。
AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray类进一步扩展了原子操作,对这些类型的数组提供了支持。例如AtomicIntegerArray是可以用原子方式更新其元素的int数组。
AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater和AtomicLongFieldUpdater是基于反射的实用工具,可以提供对关联字段类型的访问。例如AtomicIntegerFieldUpdater可以对指定类的指定volatile int字段进行原子更新。
DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder是JDK1.8新增的部分,是对AtomicLong等类的改进。比如LongAccumulator与LongAdder在高并发环境下比AtomicLong更高效。
原子类可以替换锁吗?
原子类不是锁的常规替换方法。仅当对象的重要更新限定于单个变量时才应用它。
原子类和java.lang.Integer等类的区别
原子类不提供诸如hashCode和compareTo之类的方法。因为原子变量是可变的。
为什么只提供了int、long、boolean这几种基本类型的原子类?
待补充。
本文就讲到这里,想了解Java并发编程更多内容请参考:
- Java并发编程札记-目录
END.