专栏首页happyJared乐观锁的缺点

乐观锁的缺点

ABA 问题

如果变量 V ,初次读取时是 A 值,并且在准备赋值的时候,检查到它仍然是 A 值,这样能否说明它的值,没有被其他线程修改过?答案是否定的,因为在这段时间内,它的值可能被更改为其他的值,然后又改回成了 A 值,那 CAS 操作就会误认为它从来没有被修改过。这个问题,被称为 CAS 操作的 ABA 问题

JDK1.5 以后的 AtomicStampedReference 类提供了这样的功能,其中的 compareAndSet() 方法,就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,才会以原子的方式,将该引用和该标志的值,设置为给定的更新值。

循环时间长,开销大

自旋 CAS(也就是不成功就一直循环执行直到成功),如果长时间不成功,会给 CPU 带来非常大的执行开销。 如果 JVM 能支持处理器提供的 pause 指令,那么效率会有一定的提升,pause 指令有两个作用,第一,它可以延迟流水线执行指令(de-pipeline),使 CPU 不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在退出循环的时候,因内存顺序冲突(memory order violation),而引起 CPU 流水线被清空(CPU pipeline flush),从而提高 CPU 的执行效率。

只保证单个共享变量的原子操作

CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时,CAS 操作无效。但是从 JDK1.5 开始,提供了 AtomicReference 类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里,来进行 CAS 操作。所以可以使用锁,或者利用 AtomicReference 类,把多个共享变量合并成一个共享变量来操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadLocal 简介及示例

    通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每个线程都有专属的本地变量,那该如何实现? JDK 中提供的 ThreadLocal 类正...

    happyJared
  • Lamda 表达式作用域和内置函数式接口

    但是和匿名对象不同的是,这里的变量 num 可以不用声明为 final,该代码同样正确:

    happyJared
  • Elasticsearch 6.3.2版本踩填坑指南

      前端时间利用ES开发一个"附近地理位置+其它信息"查询搜索的功能(据了解,Redis和PostgreSQL也能实现同样的功能),实践中遇到了不少的问题,所以...

    happyJared
  • 爱奇艺NLP:BiLSTM_CRF的关键词自动抽取

    https://github.com/macanv/BERT-BiLSTM-CRF-NER

    机器学习AI算法工程
  • 公司gitlab不支持ssh时,用http提交代码免密输入方法

    由于公司内网22端口被封,只能拨vpn 才能用ssh 提交代码。因此记录以下免密码http(https)提交方式。

    吴裕超
  • 【论文笔记系列】AutoML:A Survey of State-of-the-art (下)

    上一篇文章介绍了Data preparation,Feature Engineering,Model Selection,这篇文章会继续介绍后面的内容。

    marsggbo
  • 【Flutter 专题】54 图解 Flutter 基本生命周期

    和尚使用 Flutter 这么长时间,并没有认真研究过 Flutter 的生命周期,今天和尚分几个场景学习一下 Flutter 的生命周期;

    阿策
  • Mybatis XML 映射配置文件 -- 熟悉配置

    来源:http://www.mybatis.org/mybatis-3/zh/configuration.html properties mybatis读取属性...

    Ryan-Miao
  • 从吴恩达深度学习课程中学到的21个心得

    编译:新知之路、小饭盆、钱天培 今年8月,吴恩达的深度学习课程正式上线,并即刻吸引了众多深度学习粉丝的“顶礼膜拜”。一如吴恩达此前在Coursera上的机器学习...

    企鹅号小编
  • 竞赛老陪跑怎么办?来自一位Kaggle比赛失败者的含泪总结

    Kaggle比赛应该是数据竞赛中公认含金量最高的那个。每场比赛,参加的队伍至少上千人,也并非每次都次都能脱引而出,一不小心就要陪跑。

    大数据文摘

扫码关注云+社区

领取腾讯云代金券