6.Java内存模型(JMM)-指令重排

本文探讨了Java内存模型中指令重排的概念,强调了重排的两个关键限制:单线程环境下不能改变程序运行结果以及遵循happens-before原则。介绍了三种类型的重排序:编译器优化、指令级并行和内存系统重排序,并指出Java通过内存屏障来防止处理器重排序。同时,文章提到了as-if-serial语义,保证了单线程程序的执行结果不受重排序影响。
摘要由CSDN通过智能技术生成

       在执行程序时,为了提高性能,处理器和编译器常常会对指令进行重排序;当然不能随意重排序,指令重排需要满足以下两个条件:

       1.在单线程环境下不能改变程序运行的结果;

       2.存在数据依赖关系的不允许重排序;

       其实这两点可以归结于一点:happens-before规定的顺序不能改变,其他的JMM允许任意的排序;

      从硬件架构上来说,指令重排序是指CPU采用了允许将多条指令不按照程序规定的顺序,分开发送给各个相应电路单元处理,而不是指令任意重排。

       重排序分成三种类型:

       1.编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序;

       2.指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序;

       3.内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行;


禁止指令的重排序

       从Java源代码到最终实际执行的指令序列,会经过三种重排序;

      但是,为了保证内存的可见性,Java编译器会在指令序列的适当位置插入内存屏障指令,来禁止特定类型的处理器重排序;

      对于编译器的重排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值