我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果..... (带来个毛的不确定,他奶奶的多线程只存在于学习Java基础,实际工作中用的很少,除非是自己造轮子:所以我写这个算不算咸吃萝卜淡操心捏?) 本文大部分来自于:Java内存访问重排序的研究,想看原作请移步. 如下代码可能的结果有哪些? public class PossibleReorderin
指令重排是指:代码执行顺序和预期不一致. 代码运行一般步骤为: 1.从内存中获取指令解码 2.计算值 3.执行代码操作 4.把结果写回内存 而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成,就进行对下一个指令解码计算. 发生指令重排是CPU为了提高性能,但必须是对结果不影响的情况,比如: a =1; b =2; 先计算a 或者 b 对结果来说没有影响,就有肯能发送重排:而像 a = 5; b = a*3;这样的代码则不会发生重排. 一把发生指令重排在单线程中基本没啥影响,当时在多线程中
一.指令重排问题 你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排. 1.1 虚拟机层面 我们都知道CPU执行指令的时候,访问内存的速度远慢于 CPU 速度. 为了尽可能减少内存操作带来的 CPU 空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱:即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行. 当然这样的前提是不会产生错误.不管谁先开始,总之后面的代码在一些情况下存在先结束的可能. 1.2 硬件层