有人告诉我volatile关键字可以在变量的写操作之前增加内存屏障。所以我写代码:

public class Test {
    private Object o;

    public Test() {
        this.o = new Object();
    }

    private volatile static Test t;

    public static void createInstance() {
        t = new Test();             // volatile would insert memory barrier here.
    }

    public static void main(String[] args) throws Exception {
        Test.createInstance();
    }
}

然后反编译它:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   new #2; //class java/lang/Object
   8:   dup
   9:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   12:  putfield    #3; //Field o:Ljava/lang/Object;
   15:  return

public static void createInstance();
  Code:
   0:   new #4; //class Test
   3:   dup
   4:   invokespecial   #5; //Method "<init>":()V
   7:   putstatic   #6; //Field t:LTest;
   10:  return

public static void main(java.lang.String[])   throws java.lang.Exception;
  Code:
   0:   invokestatic    #7; //Method createInstance:()V
   3:   return

}

我看不到任何与内存屏障相关的信息,然后删除了volatile并再次对其进行反编译,字节码完全没有变化。

我如何在字节码中找到任何内容?

最佳答案

内存屏障的概念在Java规范级别上不存在。它是某些CPU架构的底层实现细节,例如NUMA架构,该架构是当今最流行的。

因此,您需要查看特定JVM实现(例如x86体系结构上的HotSpot)内部的即时编译器生成的机器代码。在这里,如果您有足够的技巧来解释x86机器代码,您将看到内存障碍的体现。

09-10 05:44
查看更多