7-编译器/处理器的重排序

  1. 编译器/处理器的重排序
    1. 流程

7-编译器/处理器的重排序_第1张图片

    1. 原则:

编译器和处理器在重排序时,会遵守数据依赖性。不会改变存在数据依赖性关系的操作的执行顺序。

    1. as-if-serial规则

内容:在单线程内,指令重排序后,其执行结果不能被改变。

即编译器和处理器不会对存在数据依赖关系的操作做重排序

    1. happens-before规则

目的:保证跨线程的内存可见性以及指令执行结果的不变性。

内容:如果一个操作A发生在另外一个操作B之前(可不同线程之间的操作),则A的执行结果对B是可见的,且A在B之前执行。如果一个操作A发生在另外一个操作B之前(可不同线程之间的操作),那么编译器处理器重排序之后不一定按照happens-before顺序执行,但执行结果肯定和happens-before执行结果一致。

    1. 重排序的规则

程序顺序规则:即保证单线程内操作的执行顺序不变

监视器锁规则:加锁在解锁之前

volatile变量规则:即共享变量的写对于之后的读都是生效的

传递性:A在B之前,B在C之前,那么A 在C之前

start()规则:线程A内执行B.start(),必定在B中的其他任意操作之前

join()规则:线程A中执行B.join(),则B中的操作肯定在B.join()返回之前执行

程序中断规则:线程interrupted()方法的调用,在被中断线程的代码检测到中断时间之前发生。

对象finalize规则:对象的初始化执行完成,必定在它finalize()之前完成

    1. 内存屏障(Memory Barrier )

内存屏障,又称内存栅栏,是一个CPU指令,可以禁止特定类型处理器的重排序,以保证特定操作的执行顺序,以及某些数据(或则是某条指令的执行结果)的内存可见性。

 

多线程学习大纲:https://mp.csdn.net/postedit/84768644

你可能感兴趣的:(多线程)