java cas volatile_VolatileCAS浅析
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浅析相关推荐
- 死磕java并发cas_死磕Java——CAS
一.死磕Java--CAS 前面我们说到volatile不保证原子性,解决办法就是使用AtomicInteger代替int,但是为什么使用AtomicInteger就可以保证了原子性了,是因为Atom ...
- Java中classLoader浅析
转载自 Java中classLoader浅析 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下 ...
- [Java类加载器]Java中classLoader浅析.
[Java类加载器]Java中classLoader浅析. 本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclips ...
- java 声音技术浅析
java 声音技术浅析 java 的魅力之一就是对多媒体的支持,Appley使得原来沉闷的网页变得 丰富起来,在java.applet中提供了很多功能强大的方法对多媒体的支 持.现在我们就java中的 ...
- Java CAS底层原理
Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...
- java CAS原语
java 中的synchronized关键字是悲观锁 也叫独占锁 所谓悲观锁就是某一线程独占资源,其他线程只能干等着,这种锁在高并发中性能很差 还有一种实现锁的方式是乐观锁 乐观锁实际上并不加锁,当计 ...
- java CAS和AQS
全面了解Java中的CAS机制 https://www.jb51.net/article/125232.htm https://www.cnblogs.com/javalyy/p/8882172.ht ...
- Java CAS 原理分析
1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作数 – 内存位置.预期数值和新值.CAS 的实现逻辑是将内存位置处的数值 ...
- java内存模型浅析_浅析java内存模型
原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...
最新文章
- 央行发布论文:区块链能做什么,不能做什么?
- [训练日志] 7月22-31日
- Kubernetes网络方案Flannel的学习笔记
- Markdown 如何编写表格(格式)?
- 使用ajax+php+mysql实现数据库定时刷新
- 如何选择IDC服务器托管服务商
- python关于字符串的内置函数_Python 字符串内置函数(二)
- mysql中delete from in子查询删除失败
- 使用PDO连接数据库 查询和插入乱码的解决方法
- 实践单元测试-Using NUnit 大纲
- 中国数据中心加速卡市场趋势报告、技术动态创新及市场预测
- PHP开发网站全过程技术知识分析
- TPC-DS标准规范(2)
- Python+OpenCv实现摄像头人脸识别
- STC单片机 定时器时钟FOSC 1T 12T、定时器模式
- 龙少的Linux配置大全
- 开发者必备的顶级Android开发工具,成功入职阿里
- FPGA开发基本流程
- 平台搭建_记一次CTFd平台搭建
- 关于DBA或SA这个职业的讨论