原子变量类
Posted rouqinglangzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原子变量类相关的知识,希望对你有一定的参考价值。
在原子变量类(例如java.util.concurrent.atomic中的AtomicXxx)中使用了这些底层的JVM支持为数字类型和引用类型提供了一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时则直接或间接的使用了这些原子变量类。
五、原子变量类
共有12个原子变量类,可分为4组:
- 普通原子变量类(标量类:Scalar)(4个):AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference
- 数组原子变量类(3个):AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray
- 复合原子变量类(2个):AtomicMarkableReference, AtomicStampedReference
- 更新器类(3个):AtomicIntegerFieldUpdate, AtomicLongFieldUpdate, AtomicReferenceFieldUpdate
普通原子变量类,分别对应boolean, int, long, object的原子操作
数组原子变量类,是普通原子变量的数组版,能够完成对数组中元素的原子操作。主要的方法和普通原子类型类似
复合原子变量类,AtomicReference的功能增强版,AtomicMarkableReference能够把引用跟一个boolean绑定,AtomicStampedReference能够把引用和一个int型的版本号绑定来完毕时间戳的功能。
更新器类,域更新器是一种优化手段,它提供了现有volatile域的一种基于反射的视图。从而能对现有volatile域进行CAS操作。我们知道volatile字段仅仅保证可见性,可是不保证原子性,
假设要想对volatile字段进行CAS操作。就要用到域更新器。它的优点是能够让volatile字段具备原子变量的能力,而不须要实际创建这么多的原子变量,毕竟volatile比起原子变量来说还是轻量级的。
域更新器没有提供对外的构造函数,它须要利用工厂方法的方式来创建。提供一个newUpdater(xxx)方法来返回一个新建的域更新器对象。
下面是AtomicInteger中的getAndIncrement()的实现。(基于Jdk1.7)
// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
public final int get() {
return value;
}
public final int getAndIncrement() {
//重试直至成功
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
/***使用CAS来更新****/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
代码表明:AtomicInteger在做自增(++)操作时,使用底层的CAS来保证对变量的更新。用for循环则是自旋操作,保证CAS失败后不断重试直到成功,所以说CAS是无阻塞的。
其中,compareAndSwapInt是一个JNI操作,基于CAS指令来实现的。
以上是关于原子变量类的主要内容,如果未能解决你的问题,请参考以下文章