通过一个形象的例子描述java中的指令重排
1.概述
指令重排实际上是对指令的"优化"。指令重排指的是给定的顺序和实际上执行的顺序不一致。在程序执行过程中,有不到万分之一的概率会产生指令重排。指令重排不能违背"happen-before"(先发生 - 要想使用这个东西,之前必须先有这个东西)原则。在多线程执行相同代码的前提下,如果产生指令重排,就会导致多个线程获取到了不同的结果 - 结果产生了二相性 - 在多线程条件下,一般会禁止指令重排
2.描述说明
例如:做题顺序,希望的顺序是按照题号顺序做,但是在实际中先做会做的-------类似指令重排
它的本质也是一种优化
购物也是类似,先看到什么买什么,不一定要安装清单的顺序
指令重排不能违背“happen-befor(先发生--前人栽树后人乘凉--要想使用这个东西,之前必须有这个东西) 原则。如下代码不可能产生1,3,2 等,只能产生213 这种情况的重排。在下面例子中,结果不会受到影响
下面例子会对结果产生影响
如果在多线程执行相同代码的情况下,产生了指令重排,这些线程就获取到了不同的结果(结果产生了二相性)---在多线程的情况下,一般会禁止指令重排(发生的概率太低--老计算机概率略高,无法演示)
代码到指令的执行过程,任何一个过程都可能产生指令重排