volatile禁止指令重排

JMM要求有序性

计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种

单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程不用关心指令重排)
处理器在进行重新排序是必须要考虑指令之间的数据依赖性

多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测

源码写的顺序不见得和编译的指令顺序一样

例子1

比如源码如下

public void mySort(){int x=11;//语句1int y=12;//语句2x=x+5;//语句3y=x*x;//语句4
}

但是其中编译后的指令顺序可能为:

1234
2134
1324

问题:
请问语句4 可以重排后变成第一条码?
答:存在数据的依赖性 ,语句4 没办法排到第一个

正常情况下指令不重排,不是每次指令都会重排

例子2
int a ,b ,x,y=0;
线程1 线程2
x=a;   y=b;
b=1;   a=2;
结果 :x=0 y=0   如果编译器对这段代码进行执行重排优化后,可能出现下列情况:
线程1 线程2
b=1;   a=2;
x=a;   y=b;结果:  x=2 y=1  这也就说明在多线程环境下,由于编译器优化重排的存在,两个线程使用的变量能否保持一致是无法确定的.
例子3

两个线程分别执行method1 和method2

多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测

假设线程1首先执行method1:

默认是:

a=1;
flag=true;

因为a与flag不存在数据依赖性,很可能出现指令重排,

flag=true;
a=1;

在这种情况下,若执行完flag=true就被线程2抢走cpu执行method2,执行了if条件体内的命令,a成为5 就会和不指令重排的结果(6)不一致。

所以指令重排会造成值不一致,所以有时候我们需要 volatile禁止指令指令重排

总结(了解)

PS:学习笔记,资源:尚硅谷,周阳

Volatile-3.禁止指令重排相关推荐

  1. volatile实现禁止指令重排底层操作原理

  2. volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))

    volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线 ...

  3. Volatile:可见性保证+禁止指令重排

    Volatile 1.可见性保证 1.1 何为可见性 1.2 JAVA内存模型 1.3 voletile的实现原理 1.4.synchronized 关键字和 volatile 关键字的区别 2.禁止 ...

  4. Volatile禁止指令重排

    Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...

  5. 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排

    1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...

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

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

  7. Java面试之Synchronized无法禁止指令重排却能保证有序性

    为什么Synchronized无法禁止指令重排,却能保证有序性 前言 首先我们要分析下这道题,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念: Java内 ...

  8. (免费领取名企Java面试题)volatile作用,指令重排相关

    (免费领取名企Java面试题)volatile作用,指令重排相关 Java是当下最热门的编程语言,越来越多的年轻人开始从事Java方面的工作,高就业率,高薪水的岗位,是吸引他们的原因.每个行业都有三六 ...

  9. 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?

    前几天有一位读者找我问一个问题,说是这道题可能影响了他接下来3年的技术成长. 据说这位读者前面的很多问题会的都还可以,属于那种可过可不过的类型的,面试官出了最后一道题,就是回答的满意就可以给Offer ...

最新文章

  1. Windows Mobile 设备中心 for vista 一览
  2. 使用BCH彩色币方案发行Token已实现
  3. linux FTP服务器访问权限的问题
  4. 深圳乐易网络有限公司机试题String to Integer (atoi)
  5. 阿里P8架构师谈:架构设计经验汇总
  6. 2019年北航OO第二单元(多线程电梯任务)总结
  7. 面试官通过21天步数考察候选人诚意,结果拒了清华生收了三本生
  8. linux备份mysql怎样操作,Linux下自动备份MySQL数据库详细操作步骤(转载)
  9. 洛谷 P1993 小K的农场 解题报告
  10. R及RStudio下载安装教程(超详细)
  11. 利用可道云kodexplorer一键部署私有云!路由器免费变NAS!
  12. 设计师该如何把简历写好?
  13. 2019第八届“中国软件杯”大学生软件设计大赛赛题有哪些?
  14. 【花雕学AI】超级提问模型大全!150个ChatGPT神奇示例,让你的聊天更有趣!
  15. java scriptrunner,java使用ScriptRunner执行sql文件
  16. 【面试总结】Unity3D面试题总结
  17. 【STM32CubeMX安装】
  18. USB-C版3.7V锂电池充电与升压输出电路(5V/1A输出)-充电电源板(附电路图和PCB 抄板直接可用)
  19. 【肆】财务自由的三大核心工具
  20. 深度学习电脑配置选择

热门文章

  1. ISO格式云主机创建QCOW2格式镜像
  2. 618过后,一地鸡毛!UB Store助力商家“善后”
  3. java百里守约代码_玩百里守约的一点心得
  4. 东方财富代码选股_注册制下的选股技巧:论疫苗概念股中的牛股基因
  5. Python爬虫实战之爬取web网易云音乐——解析
  6. 实施ARIA的最佳做法
  7. Uos窗管开发IDE介绍.VSCode
  8. nginx 缓存配置详解都是干货
  9. Nginx——Nginx缓存集成
  10. onTouchEvent / MotionEvent(轨迹球事件、触摸屏事件、键盘事件)