7.互联网大厂高频面试题-ABA问题

ABA问题

ABA问题是cas的缺点之一,由cas引出。
在这里插入图片描述
ABA问题:狸猫换太子
在这里插入图片描述
多个线程有处理的时间差,会导致ABA问题,中间可以有很多个B(或者是C),只不过首位是一样的,那个慢的线程就认为没改过,会继续修改,返回true,这个过程并不是没有问题的,这就是aba问题。

AtomicReference原子引用

cas是只管开头和尾巴,对的上就ok,在一些环境下是没问题的(如果你不介意的话,只管结果不管过程),但是如果在一些环境里,要求中间不能变就出现问题了。

JUC只提供了原子基础类型,如果我们想用atomicUser这种,JUC就不提供了。但是JUC提供了自己造的方法!
在这里插入图片描述
这是一个原子包装的泛型类,丢一个User进去就变成了atomicUser了。
代码示例:
在这里插入图片描述
如果你想对某个类进行原子包装,可以参考这个类的写法。

AtomicStampedRerference版本号原子引用

cas存在aba问题,想要解决,最直接的思路就是在刚开始获取的时候,带上时间,这样最后比对的时候也比对时间,哪怕值一样,时间不一样,也对不上,不会修改。
在这里插入图片描述
在这里插入图片描述
上面是2个线程的实例,T2做了中间修改,T1想比对的时候值对的上,但是版本号明显低于最新的,就得去重新获取最新的。
加时间戳的cas类:
在这里插入图片描述

ABA问题的解决

在这里插入图片描述
这个对象维护了一个整形对象的时间戳,他们能够被原子的更新,也就是版本号。
案例复现ABA问题:
在这里插入图片描述
结果:
在这里插入图片描述
修改成功了,但是发生了ABA问题,中间有猫腻。
ABA问题解决:
在这里插入图片描述
在这里插入图片描述
第四个参数是修改后的版本号,要+1,执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值