天天看点

通过一个形象的例子描述java中的指令重排

1.概述

指令重排实际上是对指令的"优化"。指令重排指的是给定的顺序和实际上执行的顺序不一致。在程序执行过程中,有不到万分之一的概率会产生指令重排。指令重排不能违背"happen-before"(先发生 - 要想使用这个东西,之前必须先有这个东西)原则。在多线程执行相同代码的前提下,如果产生指令重排,就会导致多个线程获取到了不同的结果 - 结果产生了二相性 - 在多线程条件下,一般会禁止指令重排

2.描述说明

例如:做题顺序,希望的顺序是按照题号顺序做,但是在实际中先做会做的-------类似指令重排

它的本质也是一种优化

通过一个形象的例子描述java中的指令重排

购物也是类似,先看到什么买什么,不一定要安装清单的顺序 

通过一个形象的例子描述java中的指令重排

指令重排不能违背“happen-befor(先发生--前人栽树后人乘凉--要想使用这个东西,之前必须有这个东西) 原则。如下代码不可能产生1,3,2 等,只能产生213 这种情况的重排。在下面例子中,结果不会受到影响

通过一个形象的例子描述java中的指令重排

下面例子会对结果产生影响

如果在多线程执行相同代码的情况下,产生了指令重排,这些线程就获取到了不同的结果(结果产生了二相性)---在多线程的情况下,一般会禁止指令重排(发生的概率太低--老计算机概率略高,无法演示)

通过一个形象的例子描述java中的指令重排

代码到指令的执行过程,任何一个过程都可能产生指令重排

通过一个形象的例子描述java中的指令重排

继续阅读