并发编程之CAS解析

CAS原理

CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首
先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值

假设有三个操作数:内存值V、旧的预期值E、要修改的值U。当且仅当预期值 E 和内存值 V 相同时,才会将内存值修改为 U 并返回 true,否则什么都不做并返回 false。当然 CAS 一定要 volatile 变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值 E 对某条线程来说,永远是一个不会变的值 E,只要某次 CAS 操作失败,永远都不可能成功

 

CAS问题

ABA问题

并发环境下,假设初始条件是 A,去修改数据时,发现是 A 就会执行修改。但是看到的虽然是 A,中间可能发生了 A 变 B,B 又变回 A 的情况。此时 A 已经非彼 A,数据即使成功修改,也可能有问题

解决方案:Java也提供了相应的原子引用类AtomicStampedReference<V>

reference即我们实际存储的变量,stamp是版本,每次修改可以通过+1保证版本唯一性。这样
就可以保证每次修改后的版本也会往上递增

循环时间长开销大

自旋CAS,如果一直循环执行,一直不成功,会给CPU带来非常大的执行开销

只能保证一个共享变量原子操作

CAS 保证的是对一个变量执行操作的原子性,如果对多个变量操作时,CAS 目前无法直接保证操作的原子性的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值