volatile的实现逻辑涉及的是指令重排序原理,下面对该关键字不同情况下的指令重排序做点简单的分析.

先上一个表格列出各种重排序规则.

对上面这个表格的分析如下:

1.两个操作都是普通读和写,没有volatile要求,可以重排序
2.如果重排序,操作2(volatile读主内存)排在操作1的读和写之前:
  2-1. 操作2(volatile读主内存) -> 操作1(普通读本地内存), 两个操作并行执行互不干扰,所以重排序无影响
  2-2. 操作2(volatile读主内存) -> 操作1(普通写本地内存), 两个操作并行执行互不干扰,所以重排序无影响
3.如果重排序,操作2(volatile写主内存)排在操作1的读和写之前:
  3-1. 操作2(volatile写主内存) -> 操作1(普通读本地内存), 操作1读本地内存和操作2不干扰,
       但是操作1写本地内存后会在后面刷新主内存,操作2(volatile写主内存)的结果被覆盖,导致程序的执行结果不正确,所以不能重排序
  3-2. 操作2(volatile写主内存) -> 操作1(普通写本地内存), 和3-1类似,不能重排序、
4.操作1(volatile读主内存)
  4-1. 操作2普通读 被重排序到 操作1(volatile读主内存) 之前,对执行结果无影响,可以重排序
  4-2. 操作2普通写 如果被重排序到 操作1(volatile读主内存) 之前,并且刷新了主内存数据,则可能导致操作1(volatile读主内存)读到错误数据,所以不能重排序指令
5.操作1和2都是volatile,不能重排序
6.操作1和2都是volatile,不能重排序
7.与2类似,操作2是普通读和写
  7-1.操作2普通读,如果重排序到操作1(volatile写主内存)之前,因为读的是本地数据,与操作1无关,可以重排序
  7-2.操作2普通写,如果重排序到操作1(volatile写主内存)之前,即便主存数据后面被操作1修改了,因为写的是本地内存,而且没有volatile要求,所以对执行结果无影响,可以重排序
8.操作1和2都是volatile,不能重排序
9.操作1和2都是volatile,不能重排序

总结:
1.两个操作都有volatile要求的,一定不能重排序指令
2.后面如果是volatile写操作,则即便前面是普通写操作,为了保证主存数据是后面操作的结果,所以不能重排序
3.前面如果是volatile读操作,因为后面的普通写操作可能会刷新主存,为了保证百分百执行结果的正确,则也不能重排序
4.其他情况可以重排序指令

volatile的指令重排序理解相关推荐

  1. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  2. Java之volatile如何保证可见性和指令重排序

    1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...

  3. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

    文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...

  4. 指令重排序所带来的问题及使用volatile关键字解决问题

    首先看下如下代码: 指令重排序和优化后代码如下: if(!stop) while(true){} volatile最适合使用的是一个线程写.其他线程读的场合,如果有多个线程并发写操作,仍然需要使用锁或 ...

  5. 说说Java中原子性,可见性与指令重排序的理解

    原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断:就是不能被线程调度器中断,切换线程. 这样,才能保证,原子操作在线程切换,并行处理上保证数据地顺序累加处理. 可见性:是Jvm较为 ...

  6. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  7. java重排序_Java synchronized 能防止指令重排序吗?

    @ZealTalk 说的是 synchronized 可以防止指令重排,这个观点不对的,也欢迎回答的各位来讨论 synchronized 的有序性 来讨论这个问题先,先看看 Java 里的操作无序现象 ...

  8. 由Java引起的指令重排序思考

    背景 问题出现 最近遇到了一个NullPointerException,虽然量不大,但是很怪异,大致长这个样子 这是个什么空指针?居然说我LinkedList.iterator().hasNext() ...

  9. 什么是指令重排序和内存屏障,看完你就懂了

    面试官在问到多线程编程的时候,指令重排序.内存屏障经常会被提起.如果你对这两者有一定的理解,那这就是你的加分项. (一)什么是指令重排序 为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入 ...

最新文章

  1. 高效读CV论文法则:先在GitHub上立Flag!| 资源
  2. 离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例
  3. 轻量级3d模型查看器_耐能取得两项软件著作权,自研轻量级3D人脸识别算法领先业界...
  4. mysql-workbench连接数据库
  5. 使用请求头认证来测试需要授权的 API 接口
  6. leetcode不同路径-结题( C++、Python、解析式)
  7. matlab中图像格式转换
  8. 最新可用的快速FLV转MP4方法,解决转换后无声音及视频不流畅问题
  9. notejs 视频教程 智能社
  10. 以太网交换机的功能与特点
  11. 信息安全从业者书单推荐
  12. Java、JSP电子商城
  13. Python爬取的数据存为json文件,并读取
  14. 使用ndp.view标注大型医学图像
  15. onedrive指定文件夹备份
  16. 斐波那契数列(Fibonacci) - 这就是算法吗?爱了爱了
  17. 谷歌将发布全新搜索引擎,你期待吗?
  18. 公司域名邮箱如何注册?163公司邮箱注册好用吗?
  19. 商务与经济统计阅读笔记3
  20. Excel中ID相同对应表格内容进行合并

热门文章

  1. linux 压缩文件命令
  2. 沪深300股票聚类可视化案例||tushare完整可运行代码逐行解释
  3. 【短线策略】创新高牛股妖股主升浪启动选股交易策略
  4. linux安装包U盘刻录工具:rufus-3.13.exe
  5. 【酷站】中国互联网Web2.0 Top 100
  6. 微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”七、redis数据库缓存页面数据、使用NUXT框架搭建前台系统环境、前台系统页面、首页轮播图(banner数据显示)、首页热门课程,名师推荐
  7. 华为工程师总结的LeetCode刷题笔记提供下载,太优秀了
  8. 【愚公系列】华为云轻应用之手把手教你用搭一个WeLink上的出差应用丨【AppCube X WeLink双剑合璧】
  9. Linux IP in IP隧道简述
  10. 《Python How to Program》读书笔记