自己的总结:
1、原子类的核心是循环CAS,其中CAS使用的是unsafe类里面的3种CAS。
2、原子类共分为4类
3、CAS会带来ABA问题,所以直接使用原子类也有ABA问题。但是使用AtomicStampedReference 可以解决这个问题。
4、自己对CAS的理解:含义像下面的代码那样,if然后set,但是没有加锁,可以多线程同时执行。
synchanized(this){ if(param==1) set(2); }
5、原子类里面的实现value都是volatile。
6、问题见下面的红色标记
前言:
java.util.concurrent.atomic包里面提供的原子操作类提供了一种用法简单、简单高效、线程安全的更新一个变量的方式。
问题:原子类的核心是循环CAS,使用了unsafe里面的CAS,为什么就高效了?
1、原子更新基本类型类(只有3个)
AtomicInteger
AtomicBoolean
AtomicLong
核心实现是使用了unsafe的循环CAS。
unsafe也只提供了3种CAS:compareAndSwapObject,compareAndSwapInt,compareAndSwapLong
因为原子操作类只支持3种,其他的基本类型可以使用这三个代替。
问题:lazySet()
2、原子更新数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
构造方法传入的是个数组,原子类会复制一个数组。
3、原子更新引用类型
AtomicReference
AtomicReferenceFieldUpdater
AtomicMarkableReference
4、原子更新字段类
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicStampedReference 可以解决CAS的ABA问题
问题: 更新的字段为什么需要设置成volatile?
答:原子类里面的value都是volatile的,所以此处也需要volatile。