CAS

比较并替换,在synchronized底层实现用的非常多,可以保证多线程环境下对一个变量修改的原子性。

原理

包含3个值,当前内存值(V)、预期原来的值(E)、期待更新的值(N)


yes


no


V==E?

更新变量V并设置值为N

返回true

不更新变量V

返回false


code

public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
// 底层取到的值
var5 = this.getIntVolatile(var1, var2);
} while(
// 判断当前对象的值是否等于底层的值,相等时才执行对应的操作,才最终返回结果
// 在这里也就是 【var2 == var5 ? (var5 + var4) : false】
!this.compareAndSwapInt(var1, var2, var5, var5 + var4)
);
return var5;
}