详谈CAS---以及ABA问题

什么是CAS?

比较并交换(Compared-And-Swap),它是一条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。

CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后边的那个线程没有抢到,所以期望值和主物理内存的值不一样,修改失败。

CAS底层原理

前面我们用到了这个方法(以原子的方法将当前值加1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的 源码合并到下面这一张图上,unsafe的底层实现原理是CAS原理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

假设当前对象的值为5,它的地址在var2里边,
在这里插入图片描述

当前对象的那个值如果比较成功了,加1,不成功继续执行while循环重新获取
在这里插入图片描述

总结:

比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止.
CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值
当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

CAS缺点

1,循环时间长开销很大

在这里插入图片描述

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

对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性

3会引出来ABA问题

在这里插入图片描述
原子引用
对某个类进行包装可以使用原子引用
在这里插入图片描述
在这里插入图片描述

ABA问题的解决
时间戳的原子引用
在这里插入图片描述
下边的两个线程是对于解决ABA问题的
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值