java 编译器重排序_Java编译器重新排序
今天我读了java面试问题,我读了这个问题:
问题:考虑以下Java代码片段,它初始化两个变量并且两者都不是易失性的,并且两个线程T1和T2正在修改这些值,如下所示,两者都不同步
int x = 0;
boolean bExit = false;
Thread 1 (not synchronized)
x = 1;
bExit = true;
Thread 2 (not synchronized)
if (bExit == true)
System.out.println("x=" + x);
现在告诉我们,线程2是否可以打印“x = 0”?
所以,答案是肯定的.在解释中有“因为没有编译器的任何指令,例如同步或易失性,bExit = true可能在编译器重新排序中在x = 1之前出现.”在此之前,我不知道编译器可以在其后的另一行之前执行一行.
为什么重新排序?如果我从不同的线程向控制台打印一些内容 – 应该首先打印的行将在应该打印的行之后打印(如果它们是从同一个线程打印的话)?这对我来说很奇怪(也许,因为我第一次看到这个东西要重新排序).有人可以解释一下吗?
解决方法:
如果JIT编译器*不会根据Java标准更改结果,则可以更改执行顺序.交换
x = 1;
bExit = true;
至
bExit = true;
x = 1;
不会改变结果,因为没有同步,即.根据标准,这些变量在执行此操作时不应由另一个线程读取,并且这些语句都不需要另一个变量. (在现代CPU上,两个命令实际上将同时执行,这当然意味着它是未指定的,将首先更改.)
不仅重新排序会导致该行为.可能会发生bExit可以在一个内存页面中而x在另一个内存页面中,如果应用程序在多处理器(或多核)系统上运行,那么在没有同步的情况下,可能会发生带有bExit的内存页面(在带有x的内存页面之前,所有其他内核中都会显示对它的更改.
*编辑:Java编译器(将.java编译成.class)不能改变线程内执行顺序,但JIT编译器(将.class编译成二进制代码)可以.但是,如果Java编译器认为它们是多余的,则可以省略它们.
x = 1;
bExit = true;
x = 2;
可以优化远x = 1;
标签:java,multithreading
来源: https://codeday.me/bug/20190612/1222339.html
java 编译器重排序_Java编译器重新排序相关推荐
- java 内存排序_详细解析Java内存,处理器重排序,编译器重排序以及它对线程的影响...
欢迎大家搜索"小猴子的技术笔记"关注我的公众号,有问题可以及时和我交流. 我们在编写程序的时候有一个编写代码的顺序,那么计算机执行的时候就是按照我们编写代码的顺序来执行的吗?答案是 ...
- java 编译运行原理_Java编译和解释执行对比及原理解析
编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...
- java 怎么自定义排序_Java如何实现List自定义排序
Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...
- java 链接重排序_JAVA中JVM的重排序详细介绍
重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段.重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境 在并发程序中,程序员会特别关注不同进程或 ...
- java 编译原理 字符串_Java编译原理(javac)
Java中的编译分为两个部分: 源码文件编译成字节码文件(前端编译) 字节码文件被虚拟机加载以后编译成机器码(后端编译) 对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件 ...
- java的字典序排序_java实现字典序排序
2.编一个程序,定义一个字符串数组,输入若干国家名称(所有名称全用大 写或者全用小写),设计一个算法按字典顺序将这些国家名称进行排序. 3.编写一个程序,实现...... 2.编一个程序,定义一个字符 ...
- java list 拼音排序_java中实现List集合中对象元素按其属性的中文拼音排序
java中List集合的元素是按照添加顺序排序的,我们在实际开发过程中,可能会遇到需要对其内容进行排序的场景,接下来对我遇到的场景所采用的解决方式做个总结. 一.业务场景 管理后台商户名称下拉列表,需 ...
- Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母. 支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下 传统的 : List list = new ArrayLi ...
- java的hashmap排序_Java面试题:如何对HashMap按键值排序
Java中HashMap是一种用于存储"键"和"值"信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. ...
最新文章
- oracle中的sql%rowcount
- NASM中SECTION的概念
- Java技术大咖为什么都有写博客的习惯呢?
- python画图怎么调色_Python气象数据处理与绘图(19):如何使用NCL色板(调色盘思路相同)...
- JavaWeb:实现文件上传与下载
- 格力手机没有放弃!将跟上5G和柔性屏的大势
- 苹果3月新品发布会one more thing曝光:或许就是iPhone SE 2
- 智能一代云平台(四十二):关于异常的一些事
- 《数据库系统概论》错题集
- linux下安装nginx
- python实现多表合并_python实现excel多表合并的方法
- 最新系统[防黑屏版]BT及双网盘下载(ZZ)
- 荣耀8c鸿蒙,【荣耀畅玩8C评测】千元标配4GB大内存 荣耀8C给你越级体验-中关村在线...
- python-编码实现趋势外推法
- 医疗器械行业迎来黄金十年,集团采购系统助力企业把握机遇,实现高质量发展
- 十字路口红绿灯plc程序_西门子PLC编程实例详解十字路口交通灯自动控制系统!...
- 3D打印机T3升级corexy 制作过程(二)
- 支付宝集五福最全攻略,五分钟集齐五福!
- css - 实现镜头拉近效果
- Spring Boot使用@RepeatSubmit 防止重复提交
热门文章
- Transformer-XL语言模型:超长上下文依赖
- HetSANN:基于注意力模型,自动挖掘异质网络语义信息 AAAI2020
- java 小球抛物线_关于【愤怒的小鸟】其中的算法(自由落体,抛物线,碰撞,反弹)...
- 【消息队列之rabbitmq】Rabbitmq之消息可靠性投递和ACK机制实战
- 线性代数:矩阵学习笔记
- 轻松上云系列之二:其他云数据迁移至阿里云
- [zt]OJ常见的Judge Status
- 第二次裸辞_潜伏期_一些感想
- ScrollView 里面嵌套 listview 使得listview只显示一行问题解决
- 瑞星:以创新引领个人安全市场