栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CAS(乐观锁)以及ABA问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。他也会判断相等。解决此问题的方式就是使用版本号。每次更新的时候把版本号也更新。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/712623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号