CAS机制和ABA问题的解决

CAS 是英文单词 Compare And Swap 的缩写,翻译过来就是比较并替换。它当中使用了3个基本操作数:内存地址 V,旧的预期值 A,要修改的新值 B。采用的是一种乐观锁的机制,它不会阻塞任何线程,所以在效率上,它会比 synchronized 要高。所谓乐观锁就是:每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

1.什么是cas?
cas是乐观锁的一种实现方式,是一种轻量级锁,在java1.5的时候开始引入
2.cas的实现原理?
cas有3个操作数,内存值V,旧的预期值A,要更新的新值B,当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么也不做.当多个线程同时尝试使用CAS更新一个变量时,任何时候只有一个线程可以更新成功,若失败线程会重新进入循环再次进行尝试(在sync的自旋锁的时候,就是使用的cas机制,通过cas来修改markword).
cas的核心实现是unsafe,unsafe类是使java有了像c一样的操作内存空间的能力,一旦能够直接操作内存就意味着不受jvm管理,也就无法被GC,需要我们手动GC,所以很容易造成内存泄漏.具体详情不在这里展开.
*3.cas的ABA问题和解决办法?
ABA问题就是俩个线程1和2,线程1从内存X中取出A,线程2也从内存中取出A,并且将A变成了B,然后线程2又将B变成了A,这时候线程1执行cas操作成功,虽然线程1执行成功了但是执行成功的A已经不是原来获取的A了,整个执行过程是有问题的,比如链表的头在进行了俩次变化后恢复为原来的值并不代表链表就没有发生变化.
解决办法:在对象中额外再增加一个字段,用来标识有没有发生过变化,比如version版本号,每次变化进行加1或者用当前时间戳,同时比较内存值和版本号,相同的才能做替换。
*4.CAS的不足?
1.如果CAS操作不成功的话,会一直自旋直到成功,cpu消耗会很大.
2.不能保证多个操作的原子性.
3.cas存在ABA问题

待更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值