一.CAS介绍
CAS采用乐观锁思维,是一种非阻塞原子性操作,保证了比较-更新的原子性。
二.CAS原理
1.CAS三个构成
内存值
旧的预期值
新的预期值
当多线程使用CAS访问共享资源时,只有一个能成功。当旧预期值和新预期值相等时才能修改成功,失败的线程可以尝试自旋或者什么都不做。
三.JUC中的CAS操作
以AtomicInteger为例,分析自增方法getAndAdd();
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
进入unsafe查看getAndAdd方法的具体实现
// val1 为内存地址 var2 为旧值 var4 为自增的数值
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
// 从val1地址上获取新的值给val5
var5 = this.getIntVolatile(var1, var2);
// 如果旧值和新值一样,则var1内存中的值更新为val4+val5,否则更新值为val1内存的值
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}