CAS(乐观锁)以及ABA问题

独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的线程释放锁。
所谓乐观锁就是每次不加锁,假设没有冲突而去完成某项操作;如果发生冲突了那就去重试,直到成功为止。
CAS(Compare And Swap)是一种有名的无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,要操作的内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B并返回true,否则返回false。

举例:

  1. 线程1要将内存地址为v的变量+1,假设初始值为10,即旧的预期值为10,新值为11,即B。
  2. 线程1读取到10,并且+1。
  3. 线程2率先将此内存地址的变量更新为11.
  4. 线程1写回时发现,此时内存的值为11,与预期值10不相等,写回失败。
  5. .线程1重新获取内存地址V的当前值,并重新计算想要修改的新值。此时对线程1来说,A=11,B=12。这个重新尝试的过程被称为自旋

CAS的优缺点:

  1. CPU可能开销较大(自旋时间长,有的时候不如直接阻塞)
  2. 不能保证代码块的原子性(只能保证一个共享变量的原子操作)
  3. ABA问题。
    ABA问题:
    CAS防止并发出错的原理是与之前的值比较是否相等,这个逻辑并不严谨。
    假如之前的值为10,后来更新为11,又更新为10。他也会判断相等。解决此问题的方式就是使用版本号。每次更新的时候把版本号也更新。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值