CAS中的ABA问题

什么是CAS

CAS即 compare and swap,比较和交换;

CAS是CPU的一条指令,是原子的,不会造成指令重排序;

由于CAS可以判定寄存器与内存中的值是否相等,若相等,就认为这个值没有被修改,因此接下来的操作就是线程安全的;

CAS可以实现原子类、自旋锁,可以避免加锁;

什么是ABA问题

现有两个线程thread1和thread2,有一个变量count = 1;

现让thread1先后两次获取count的值,发现都是1,但可能thread2对count进行了修改,但在thread1第二次获取count的值之前又将count的值改回了1,那么thread1第二次获取到的count的值就是1,虽然thread1先后两次获取到的count的值相等,但count的值发生了改变;

如何解决ABA问题

我们可以引入一个特征值来标记一个变量是否被修改但又改了回来,这个特征值这能加不能减,变量每修改一次,这个特征值就加1,现有两种方案:

1.使用时间戳:每一时刻的时间戳都是不一样的,但有一种特特例,就是闰秒,闰秒会造成前后两次的时间戳是相等的,这样就导致线程会认为变量没有被修改,会造成线程安全问题,因此不见时使用时间戳作为特征值;

2.使用版本号:自己定义一个变量,这个变量只能加不能减,只要变量被修改就会将版本号加1,这样线程获取到版本号时,发现版本号被修改就会知道这个变量被修改过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值