volatile
키워드가 변수 쓰기 작업 전에 메모리 장벽을 추가 할 수 있다고 들었습니다. 그것은 디 컴파일Java에서 휘발성 변수를 디 컴파일하는 방법은 무엇입니까?
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
를 제거하고 다시 디 컴파일, 바이트 코드 그래서 나는 코드를 작성 전혀 변하지 않습니다.
어떻게 바이트 코드로 찾을 수 있습니까?
감사합니다. @Marko, 메모리 장벽이 JIT에 의해 생성되었지만, 변수가 휘발성임을 나타내는 일부 구문이 바이트 코드에 있어야한다고 생각합니까? 바이트 코드는 비 휘발성과 똑같은데 JVM이 어떻게 휘발성이 있다는 것을 알 수 있습니까? : D – MrROY
변수 자체에 플래그가 있지만 액세스하는 코드에는 없습니다. –
휘발성 변수의 세부 정보를 표시 할 수있는 디 컴파일 도구가 있습니까? – MrROY