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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!