CAS
compare and set 的简写,意思为比较相等则设置值,这里为这是一个操作,而不是先比较相等,再去设置值,即所谓拥有原子性。CAS的是本身cpu的指令,下面看一下jdk中的使用吧,AtomicInteger举个栗子,使用CAS自增1的操作,如何保证线程安全的
public final int getAndIncrement() {
// 调用下面的方法
return U.getAndAddInt(this, VALUE, 1);
}
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
// 先拿到当前值v, 循环使用CAS操作直到对比成功内存中值=v,则将内存值更新为 v+1
v = getIntVolatile(o, offset);
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
return v;
}
weakCompareAndSetInt 这个方法再往下就是调用的native方法了,这里的解析TODO
可以看到这里使用while循环,直至CAS成功,什么情况会不成功呢,比如A,B两个线程同时执行getAndIncrement方法,A线程执行getAndAddInt方法事拿到v的值为1,但这时B已经成功CAS将内存值更新为2了,那么A线程CAS中compare失败,while条件成立,进行下一次循环,第二次CAS成功,将v更新成3。
所以大部分的CAS操作伴随循环比较的操作,优点是不需要锁住资源,没有线程上下文切换,缺点是容易cpu飙高(一直while循环),所以在某些场景使用CAS是可以提高并发效率的