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

  1. 编译器/处理器的重排序
    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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值