Java中的13个原子操作类
1、背景
Java从JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。
Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新属性。
Atomic包里的类基本都是使用Unsafe实现的包装类。
2、原子更新基本类型
Atomic包提供了以下3个类:AtomicBoolean、AtomicInteger、AtomicLong。
Unsafe只提供了3种CAS方法:compareAndSwapObject、compareAndSwapInt、compareAndSwapLong,再看AtomicBoolean源码,发现它是将Boolean转换成整型,再使用compareAndSwapInt进行CAS,所以原子更新char、float和double变量也可以用类似的思路来实现。
3、原子更新数组
Atomic包提供了以下3个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。
4、原子更新引用类型
Atomic包提供了以下3个类:AtomicReference、AtomicReferenceFieldUpdater、AtomicMarkableReference(原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。。
5、原子更新字段类
Atomic包提供了以下3个类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicStampedFieldUpdater(更新带有版本号的引用类型)。
要想原子地更新字段类需要两步。第一步,因为原子更新字段类都是抽象类,每次使用的时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。第二步,更新类的字段必须使用public volatile修饰符。