原子性与CAS算法

在这里插入图片描述

i++问题一个,

使用原子变量 AtomicInteger

CAS算法保证数据的原子性
CAS是硬件对于并发操作的支持

cas包括了,
内存值,V
期望值,A
更新值,B
当且仅当V==A时,才会把B的值赋给A,否则将不做什么操作

比较并交换

在这里插入图片描述
第一行结果为true 2019
第二行结果为false 2019

第一行:初始化为5,期望值也是5,所以可以修改为2019

这个时候已经为2019了

第二行:初始值为2019,期望值为5,所以就改不了1024,还是2019,

这就是cas,compare and set ,比较并交换

底层原理

在这里插入图片描述

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

cas缺点:循环时间长开销很大,源码里有do while循环,当比较不成功,会一直循环

只能保证一个变量的原子操作,当多个共享变量时,就需要加锁了

引出来的ABA问题:狸猫换太子

比如T1,需要工作10s,T2是2s
T1,T2读到A,而T1改成B,又改成了A,,这时候T1读到的还是A,而T2已经操作过,而T1不知道
这个过程虽然结果正确,但是问题很大

eg:
对象原子包装,AtomicReference原子引用,

在这里插入图片描述

解决方案

时间戳原子引用
变量带上版本号,T2修改后版本号会变更
AtomicStampReference

T1工作时连版本号也会比对,当版本号对不上,那么就不能T1修改了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值