CAS(乐观锁)以及ABA问题

CAS(乐观锁)以及ABA问题,第1张

CAS(乐观锁)以及ABA问题

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

举例:

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

CAS的优缺点:

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存