CAS详解
CAS(Compare And Swap)
- 一种无锁(lock-free)算法
- 是一种乐观锁
- 是实现自旋锁的手段
- 理论上认为从内存直接取值然后修改是顺序队列的
思想
- 使用一个原子操作。首先确定内存原值与预期原值是否相同,如果相同,然后立刻将内存原值改为新值
- 类似于修改密码:输入旧密码与新密码同时提交,如果旧密码验证通过,就将密码修改为新密码
三个操作参数
-
Volatile : 内存原值V(它的值是我们想要去更新的)
-
Expect:预期原值E(上一次从内存中读取的值)
-
Update:新值U(应该写入的新值)
操作过程
- 将内存位置V的值与E比较(compare)。
- 如果相等,则说明没有其它线程来修改过这个值,所以把内存V的的值更新成U(swap)
- 如果不相等,说明V上的值被修改过了,不更新,而是返回当前V的值,再重新执行一次任务再继续这个过程
- 当多个线程尝试使用CAS同时更新同一个变量时,其中一个线程会成功更新变量的值,剩下的会失败。失败的线程可以重试或者什么也不做。
代码
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
优点
- 轻量锁机制,减少CPU切换带来的性能开销。
缺点
- 循环需要消耗cpu的计算开销。
- 只能保证一个共享变量的原子操作。
问题
- 对于ABA问题,在>=JDK1.5的AtomicStampedReference可以解决这个问题
参考
https://wiwiki.kfd.me/wiki/比较并交换
https://segmentfault.com/a/1190000015239603
https://www.jianshu.com/p/450925729f72
https://juejin.im/post/6844904086920249357