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

posted @   FynnWang  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示