编译器优化技术

编译器的目标虽然是做由程序代码翻译为本地机器码的工作,但其实难点并不在于

能不能成功翻译出机器码,输出代码优化质量的高低才是决定编译器优秀与否的关键。

注意!即时编译器对代码的优化变换是建立在代码的中间表示或者是机器码之上的,

绝不是直接在Java源码上去做的。

问题

指令重排是发生在解释执行还是在即时编译后的?

答:看高效并发的部分P440提到,Java虚拟机的即时编译器中有指令重排(Instruction Reorder

的优化。

如果指令重排只有在发生即时编译后才有,为什么我用-Xint指定用解释模式去跑验证指令重排的代码,

依旧能出现指令重排的情况?

答:为了让处理器内部的运算单元能尽量被充分利用,处理器本身就有乱序执行的优化了。

所以禁止了虚拟机的指令重排,但处理器的乱序执行依然存在。

以下代码能达到禁止指令重排+处理器乱序执行的作用吗?

private volatile boolean PROHIBIT_COMMAND_REARRANGEMENT;
private List<String> aList;
private List<String> bList;

public void add(String str) {
    // 必须保证aList先添加元素,bList后添加元素
    aList.add(str);
    PROHIBIT_COMMAND_REARRANGEMENT = !PROHIBIT_COMMAND_REARRANGEMENT;
    bList.add(str);
}