老师,为什么我试的用volitile的定义的变量也会被编译器优化

来源:9-5 jmm的内存可见性

qq_orientation_0

2019-03-07

package com.interview.javabasic.bytecode;
public class ByteCodeSample {
private static volatile Integer i = 1;

public static void main(String[] args) {
    int j=5;
    i++;
    ++j;
    System.out.println(i);
    System.out.println(j);
}

}

如上所示代码编译之后字节码文件如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.interview.javabasic.bytecode;

public class ByteCodeSample {
private static volatile Integer i = 1;

public ByteCodeSample() {
}

public static void main(String[] var0) {
    byte var1 = 5;
    Integer var2 = i;
    i = i + 1;
    int var4 = var1 + 1;
    System.out.println(i);
    System.out.println(var4);
}

}

写回答

1回答

翔仔

2019-03-08

同学好,volatile是通过插入内存屏障禁止在内存屏障前后的指令执行重排序,意思是禁止重排序,不排序前提下的优化是okay的,咱们这里的顺序没有发生变化呢。

0
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8441 学习 · 1872 问题

查看课程