Volatile关键字

先了解一个概念JMM内存模型图:

每个线程在操作的时候都会有一个属于自己的工作内存(即上图中的本地内存),这些工作内存存在的变量都是从主物理内存(即上图的主内存)拿到的,那么在进行更改的时候,需要在本地工作内存先进行操作,之后再写到主物理内存,其他线程再去取主物理内存中的值,确保数据在每个线程都是可见的,这个时候可能会有人有疑问为什么不直接在主物理内存操作,原因就是主物理内存并不能直接操作,不然也不会要有本地工作内存在,需要注意的是JMM模型并不真实存在,只是人们想象出来的一个模型

正文

你可以理解为这是一个轻量级的synchronized, volatile关键字可以保证可见性,有序性,需要注意的是volatile关键字并不能保证原子性,可以禁止指令重排,通常用于并发编程,何为原子性,就是某一个线程在进行某个业务操作时,不可分割,要么同时成功,要么同时失败,可以使用原子类(如:AtomicInteger)来解决volatile不具备原子性的问题。何为指令重排,java底层在进行编译代码的时候,会进行指令重排,计算机底层在执行代码的时有时候并不会按你写的代码顺序走,为了性能它可能会重新排序,但是一切都得遵循数据依赖性原则(就是要重新排序的东西得先确保定义了这个东西),详细见下:

具体代码示例会出现的情况:

CAS

全称Compare-And-Swap,是CPU的一条并发原语,具体功能判断内存某个位置的值是否被改过,如果是则更新新的值,整个过程是原子性的,底层是Unsafe类,CAS并发原与在Java中的体现就是Unsafe类下的各个方法,强调一下,由于CAS是系统一种系统原语,属于系统用语范畴,是由若干条命令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题。Unsafe下的所有方法都是native修饰的,也就是说直接操作底层操作系统资源执行响应任务的

应用:

CAS中有三个值,内存值V,旧的预期值A,要更改的值B

当且仅当A等于V时,将V修改为B,否则什么都不做,可以运用Atomic类来实现,如图所示:

CAS的方法其实是一个自旋锁,当条件成立的时候,他就跳出循环,没有成立期间,会一直进行自旋,如图所示:

人无完人,世间万物都是一个道理,即使说得CAS这么好,他也是有缺点的,就是想想,如果一直跳不出循环的话,会怎么样?对!会对CPU造成巨大的压力

那么说到这里,就不得不提到一个所谓的ABA问题了,何为ABA,听我慢慢跟你说

假设这个时候现在有两个线程,线程1和线程2(下面简称1,2),1是10秒钟执行一次线程,2是2秒钟执行一次线程,那么10秒的时间2是可以执行5次,显而易见,2比1速度快,那么此时2从主物理内存去拿值,值A,2从自己的工作内存将A修改为B,但是后来2脑子抽风了,又把B修改成了A,此时,1再去取主物理内存中的值,看起来是一样的,顺利拿到值A,但是实际上已经被2改过好几次了,1是毫不知情的,虽然结果没有变化,但是会带来什么后果呢?想想,一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,你老婆出轨之后又回来,还是原来的老婆吗?ABA 问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。如图所示:

那当然问题出现了,就会有结局问题的办法,如何解决ABA问题呢,在修改值的时候加上版本号即可:

java cas volatile_VolatileCAS浅析相关推荐

  1. 死磕java并发cas_死磕Java——CAS

    一.死磕Java--CAS 前面我们说到volatile不保证原子性,解决办法就是使用AtomicInteger代替int,但是为什么使用AtomicInteger就可以保证了原子性了,是因为Atom ...

  2. Java中classLoader浅析

    转载自  Java中classLoader浅析 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下 ...

  3. [Java类加载器]Java中classLoader浅析.

    [Java类加载器]Java中classLoader浅析. 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclips ...

  4. java 声音技术浅析

    java 声音技术浅析 java 的魅力之一就是对多媒体的支持,Appley使得原来沉闷的网页变得 丰富起来,在java.applet中提供了很多功能强大的方法对多媒体的支 持.现在我们就java中的 ...

  5. Java CAS底层原理

    Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...

  6. java CAS原语

    java 中的synchronized关键字是悲观锁 也叫独占锁 所谓悲观锁就是某一线程独占资源,其他线程只能干等着,这种锁在高并发中性能很差 还有一种实现锁的方式是乐观锁 乐观锁实际上并不加锁,当计 ...

  7. java CAS和AQS

    全面了解Java中的CAS机制 https://www.jb51.net/article/125232.htm https://www.cnblogs.com/javalyy/p/8882172.ht ...

  8. Java CAS 原理分析

    1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作数 – 内存位置.预期数值和新值.CAS 的实现逻辑是将内存位置处的数值 ...

  9. java内存模型浅析_浅析java内存模型

    原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...

最新文章

  1. 央行发布论文:区块链能做什么,不能做什么?
  2. [训练日志] 7月22-31日
  3. Kubernetes网络方案Flannel的学习笔记
  4. Markdown 如何编写表格(格式)?
  5. 使用ajax+php+mysql实现数据库定时刷新
  6. 如何选择IDC服务器托管服务商
  7. python关于字符串的内置函数_Python 字符串内置函数(二)
  8. mysql中delete from in子查询删除失败
  9. 使用PDO连接数据库 查询和插入乱码的解决方法
  10. 实践单元测试-Using NUnit 大纲
  11. 中国数据中心加速卡市场趋势报告、技术动态创新及市场预测
  12. PHP开发网站全过程技术知识分析
  13. TPC-DS标准规范(2)
  14. Python+OpenCv实现摄像头人脸识别
  15. STC单片机 定时器时钟FOSC 1T 12T、定时器模式
  16. 龙少的Linux配置大全
  17. 开发者必备的顶级Android开发工具,成功入职阿里
  18. FPGA开发基本流程
  19. 平台搭建_记一次CTFd平台搭建
  20. 关于DBA或SA这个职业的讨论

热门文章

  1. 【POWER】函数使用技巧
  2. Linux下无法清空回收站
  3. Three.js无限3D时空穿梭特效
  4. 百科 | 企业管理系统:是什么、用途、类型
  5. byte数组与int类型互相转换的几种方式
  6. 6. torchvision中的ResNeXt实现
  7. 阿里云趣味视觉AI训练营 实践 人脸动漫化搭建
  8. 机器学习系列(5)_特征工程02特征提取
  9. 百度人脸识别技术简单入门
  10. Sigmoid 函数(logistic函数)笔记