Atomic原子类:
Atomic本意为不可分割的最小粒子,而原子操作(Atomic Operation)意味“不可中断的的一组操作”;
即使多线程高并发的执行的时候,一个操作一旦开始就不会被其它线程干扰;原子类就是具有原子操作的特征的类,它们能无锁的方式避免原子性问题;
Juc包下的原子类都是位于atomic包下:
根据操作的数据类型,可以将JUC包下的原子类分为5大类:
1.基本类型:
AtomicInteger:整形原子类;
AtomicLong:长整型原子类;
AtomicBoolean:布尔型原子类;
2.数组类型:
AtomicIntegerArray:整形数组原子类;
AtomicLongArray:长整型数组原子类;
AtomicReferenceArray:引用类型数组原子类;
3.引用类型:
AtomicReference:引用类型原子类;
AtomicMarkableReference:原子更新带有标记的引用类型;
AtomicStampedReference:原子更新带有版本号的引用类型(利用版本号可以解决CAS中的ABA问题,原理就是比较交换数据时检查一下版本号);
4.对象的属性修改类型:
AtomicIntegerFieldUpdater:更新整形字段的原子类;
AtomicLongUpdater:更新长整型字段的原子类;
AtomicReferenceUpdater:更新引用类型字段的原子类;
5.原子累加器:
DoubleAccumulator;
DoubleAdder;
LongAccumuLator;
LongAdder;
看几个原子类的方法的源码:
AtomicInteger
//调用了魔法类Unsafe的方法:
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
再看一下Unsafe的getAndAddInt方法的实现方式:
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
//传参为当前原子类对象,记录数据的value属性的偏移量;这样就可以拿到原始数据
var5 = this.getIntVolatile(var1, var2);
//利用自旋和CAS来更新数据