CAS定义:
CAS 也就是CompareAndSwap 比较并交换,主要为了解决多线程下的原子性,大体思想就是在更新前,进行比较,举个例子AtomicInteger 下的compareAndSet(expect,update) expect 为期望值也就是未更新的值,update是如果期望值相同则更新的值。
原理:
首先compareAndSe调用了rt.jar下的Unsafe类,这个类下的大部分方法和变量都用native修饰,也就是说更多的是操作是面向地址的,也就是当我们调用时会形成系统原语,原语的执行是连续的,因此保证原子性。
源码解析:
如何保证原子性
1.在compareAndSet方法下的第一层
// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
public final int getAndIncrement() {
//this这个对象 valueoffset对应地址值,1累加
return unsafe.getAndAddInt(this, valueOffset, 1);
}
unsafe.class下的实现
public final int getAndAddInt(Object var1, long var2, int var4) {
* int var5;
* do {
var1这个对象var2.地址偏移量(内存地址)
* var5 = this.getIntVolatile(var1, var2);//获取当前值
* } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)
* //CAS比较如果为true跳出循环var5+var4执行加操作反之亦然);
*
* return var5;
* }
缺点
底层实现使用了do while 因此消耗地址
2.只能保证一个共享变量的原子操作
3.ABA问题(下一篇更新)unsafe 源码https://zhuanlan.zhihu.com/p/37579394