Volatile-3.禁止指令重排
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.禁止指令重排相关推荐
- volatile实现禁止指令重排底层操作原理
- volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))
volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线 ...
- Volatile:可见性保证+禁止指令重排
Volatile 1.可见性保证 1.1 何为可见性 1.2 JAVA内存模型 1.3 voletile的实现原理 1.4.synchronized 关键字和 volatile 关键字的区别 2.禁止 ...
- Volatile禁止指令重排
Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...
- 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...
- 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...
- Java面试之Synchronized无法禁止指令重排却能保证有序性
为什么Synchronized无法禁止指令重排,却能保证有序性 前言 首先我们要分析下这道题,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念: Java内 ...
- (免费领取名企Java面试题)volatile作用,指令重排相关
(免费领取名企Java面试题)volatile作用,指令重排相关 Java是当下最热门的编程语言,越来越多的年轻人开始从事Java方面的工作,高就业率,高薪水的岗位,是吸引他们的原因.每个行业都有三六 ...
- 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?
前几天有一位读者找我问一个问题,说是这道题可能影响了他接下来3年的技术成长. 据说这位读者前面的很多问题会的都还可以,属于那种可过可不过的类型的,面试官出了最后一道题,就是回答的满意就可以给Offer ...
最新文章
- CreateRemoteThread
- 使用SSH命令行远程登录运行在CloudFoundry上的应用
- Dubbo下载-从missing artifactId说起
- springmvc请求参数异常处理
- Web_audio_spatialization_basics
- opencv 梯度幅值_OpenCV学习:图像边缘检测
- Atitit 业务领域体系分类 目录 1. 按照互联网企业类型以及只是体系类的分类	2 2. 电子商务	2 3. **通信类社交 Im类 em	2 4. **信息搜索类爬虫	2 4.1. 媒体
- Leetcode. 回文字符串的分割和最少分割数
- VMware ESXi6.0注入8060阵列卡驱动过程记录
- 软件能力成熟度模型CMM
- 求购二手《良葛格Java JDK 5.0学习笔记》
- 计算机中mpeg代表什么,mpg和mpeg格式的区别
- excel2016中绘制多条折线的散点图
- 京瓷1025打印机打印有底灰简单处理
- 山下英子与家政学员亲密接触 深度解读断舍离生活美学
- 敏捷个人俱乐部(北京)线下活动 开始报名了!
- #距离#JZOJ 3256 BZOJ 3170 洛谷 3964 松鼠聚会
- 四位行波进位加法器_行波进位加/减法器的硬件开销和性能分析
- STC8H驱动hub75e接口的64*64LED点阵屏
- 帝国理工学院计算机科学与技术申请条件,伦敦帝国理工学院计算机理学硕士研究生申请要求及申请材料要求清单...
热门文章
- Linux小记--centos,debian系统挂载镜像方式
- Spring Cloud 第十五天
- 为什么拿相机对着电脑屏幕照相,照片会出现波纹?
- iterator 怎么使用甀_迭代器(Iterator)的使用方法
- 如何解决Login failed for user: AccountName这个错误
- python解析json文件案例_Python加载带有注释的Json文件实例
- 熔断器模式(CircuitBreaker)
- Pycharm 出现 进程已结束,退出代码-1073741819 (0xC0000005) 的问题 可能的解决方法
- Git创建本低分支并提交到远程仓库
- qml实现的聊天界面