CAS(Compare-And-Swap),它是一条CPU并发原语,用于判断内存中某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。

CAS基本原理

CAS并发原语体现在Java中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现CAS汇编指令。这是一套完全依赖于硬件的功能,通过它实现了原子操作。由于CAS是一种系统原语,原语属于操作系统用语,原语由若干指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被终端,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题

JDK1.5之后,Java类库才开始使用CAS才开始使用CAS操作,,HotSpot虚拟机在内部对这些方法做了特殊的处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,或者可以认为是无条件内联进去了,不过Unsafe类本来就不是给用户程序调用的类(Unsafe::getUnsafe()的代码里面限制了只有启动类加载器加载的Class才能访问它)

unsafe类分析

如下是Unsafe类中的compareAndSwapInt,是一个本地方法,在unsafe.cpp中

CAS具体应用

V;内存中地址存放的实际值

O:预期值(旧值)

N:新值,表示我们准备更新V的值

当执行CAS后,如果V == O ,即旧值与内存中实际值相等,表示上次修改后没有任何线程再次修改此值,因此可以将N替换到内存中。

如果 V != O,表示该内存中的值已经被其他线程做了修改,所以无法将N替换,返回最新的值V

当多个线程使用CAS操作一个变量时,只有一个线程会成功,并成功更新变量值,其他线程均会失败。失败线程会重新尝试或将线程挂起(阻塞)

CAS实现原子操作三大问题

CAS的ABA问题

CAS算法实现的一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化,比如线程M从内存位置W取出值A,这时N也取出A,N操作后A变成了B,然后N将B又变回A,这时线程M在CAS操作时发现内存中仍然是A,然后M执行成功,M虽然执行成功,但实际上就出现了ABA问题。

解决方案:Java1.5开始,JDK的Atomic包里提供了一个类AtomicStampedRefernce来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查标志stamped是否为预期标志,如果全部一致,则继续。

CAS的循环时间长开销大问题

自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销,如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升

pause指令的两个作用:

第一,它可以延迟流水线执行指令,使CPU不会消耗过多的执行资源

第二,它可以避免在退出循环的时候因内存顺序冲突而引起CPU流水线被清空

CAS的只能保证一个共享变量的原子操作问题

当对一个共享变量进行原子操作,循环CAS可以解决,但是如果是多个共享变量呢?循环CAS无法解决这个问题。

取巧的话就是合并共享变量:i=2,j=a -> ij=2a; 如此合并就可以操作了

解决方案:Java 5 开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象进行CAS操作

CAS是什么?彻底搞懂CAS相关推荐

  1. cas无法使用_一文彻底搞懂CAS实现原理

    本文导读: 前言 如何保障线程安全 CAS原理剖析 CPU如何保证原子操作 解密CAS底层指令 小结 前言 日常编码过程中,基本不会直接用到 CAS 操作,都是通过一些JDK 封装好的并发工具类来使用 ...

  2. Java成神之路——一文搞懂CAS

    CAS是什么 CAS(Compare And Swap)比较与替换.在高并发编程中大量使用. 为什么需要CAS 在多线程环境下对一个变量进行并发修改是不能保证原子性的.例如多线程下对一个int类型变量 ...

  3. 一文搞懂CAS,CAS原理分析及ABA问题详解

    什么是CAS CAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS ...

  4. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

  5. 量子计算还没搞懂,光子计算又要来统治世界?

    [CSDN 编者按]去年 12 月,量子计算原型机"九章" 惊人的单项计算能力超过了 Google 当年水平,国人自己也手握一份"量子霸权",新年伊始,两篇关于 ...

  6. 100个问题搞懂Java并发

    写在前面 100个问题搞定Java虚拟机 100个问题搞定大数据理论体系 1000个问题搞定大数据技术体系 目录结构 什么叫线程安全? 同步和异步有什么区别? 并发和并行有什么区别? 死锁.活锁和饥饿 ...

  7. 带你彻底搞懂锁膨胀,偏向锁,轻量级锁,重量级锁

    1.synchronized 我们都知道synchronized内部有四种状态,分别是:无锁.偏向锁.轻量级锁和重量级锁,所以要搞懂这几种锁之间的变化我们得对synchronized有个大致的了解. ...

  8. 为了搞懂神经元如何精准连接,科学家解剖了9000多个果蝇大脑 | 斯坦福大学

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 白交 发自 凹非寺 量子位 | 公众号 QbitAI 为了搞懂神经元 ...

  9. 【四】彻底搞懂synchronized

    [四]彻底搞懂synchronized 废话不多说,我们先来看一个段代码,了解一个奇怪的现象 public class Synchronized03 implements Runnable {priv ...

最新文章

  1. xml tools属性详解
  2. ZCMU 1958: 机器翻译(技巧性的模拟)
  3. aws mysql价格_mysql – AWS RDS“转出”成本有多贵?
  4. scrapy如何指定生成python3的项目_新手学习scrapy的坑(都是泪)
  5. [你必须知道的.NET]第二十九回:.NET十年(上)
  6. php 代码 自动检查工具下载,PHP_CodeSniffer安装和使用教程(自动代码检查规范工具)...
  7. Node MemoryLeak
  8. Layui导航、面包屑
  9. 庆祝本人在cnblogs排名进入前2000!
  10. array2xml xml2array
  11. Python:身份运算符is和==的区别
  12. json标准格式举例_JSON格式简介及一些对应函数
  13. Java全套视频教程
  14. FaceBook流程到底应该如何?
  15. 按键精灵助手之按钮响应事件
  16. 我在知乎上关于Laser200/310电脑的文章。
  17. 京东用了哪些大数据平台产品体系?
  18. This Python interpreter is in a conda environment问题解决
  19. 数码管:3位6脚的数码管分析和编码
  20. python 单通道tiff图转jpg

热门文章

  1. 新版phicomm虚拟服务器,【2019年2月13日】Phicomm N1 sx05re 2.1最终版64G懒人包
  2. 数据库结构设计(逻辑设计和物理设计)
  3. 《数据库原理》课程设计-mysql
  4. 美通社企业新闻汇总 | 2019.1.8 | 海信在CES发布100吋三色激光电视,良品铺子品牌新定位高端零食...
  5. Unity打开项目之Hold on,之第一次打开25G的文件夹,之我的自闭之旅
  6. 锐捷深入油田场景 助力胜利油田生产物联网通向“新胜利”之路
  7. 解决IDEA中maven项目视图中出现红色波浪线的问题
  8. 【原版教材•中英对照】半导体器件物理——这本经典著作在半导体器件领域树立起了先进的学习和参考典范
  9. 在线支付接口开发总结
  10. lauch启动文件的使用方法