指令重排序

数据依赖性:

    所谓的数据依赖性指的是在单线程中出现的数据依赖问题,如以下情况:

  1.     写后读a = 3 ,b= a  
  2.     写后写a= 3 , a= 4
  3.     读后写 b=a,a=3

    以上三种情况下,如果我们进行了数据的指令调换,就会造成数据的脏读,这就是数据的依赖性

as-if-serial:

   不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵守 as-if-serial 

    因此,我们进行指令重排的时候,是不会对有数据依赖性的指令进行重排操作的。但是我们可以重排一些没有依赖性的指令。如以下所示

    a = 2; b= 3; c= a*b;  在这三条指令中,如果重排a =2 和 b = 3 ,其效果是一样的,但是 C 必须在 a 和 b 进行之后。

程序的顺序规则:

    在上述的三条指令中,我们可以归纳出 1 before 2 ,2 before 3 ,1 before 3 的规则,但是我们可以看到 1 before 2 的规则在java内存管理JMM中,并不要求1在2之前执行,而是要求第一个操作对后一个操作是可见的,因此这种情况下,jmm是可以允许重新排列指令的

多线程下的指令重排:

    在多线程程序中,对存在控制依赖的操作重排序,可能会改变程序的执行结果。但是在单线程中,可以运行对存在控制依赖的操作进行重排序

    控制依赖:如下图,多线程下指令重排就会影响结果。

    指令重排序_第1张图片

 

指令重排序:

    

转载于:https://my.oschina.net/u/4189935/blog/3095067

你可能感兴趣的:(指令重排序)