2013-06-03 2 views
6

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를 제거하고 다시 디 컴파일, 바이트 코드 그래서 나는 코드를 작성 전혀 변하지 않습니다.

어떻게 바이트 코드로 찾을 수 있습니까?

답변

9

메모리 베리어의 개념은 Java 사양 수준에 존재하지 않습니다. 현재 가장 많이 사용되는 NUMA 아키텍처와 같은 특정 CPU 아키텍처에 대한 저수준 구현 세부 사항입니다.

따라서 x86 아키텍처의 HotSpot과 같은 특정 JVM 구현 내부의 Just-in-Time 컴파일러에서 생성 된 기계 코드를 살펴 봐야합니다. x86 컴퓨터 코드를 해석 할만큼 숙련 된 사용자라면 메모리 장벽이 나타납니다.

+1

감사합니다. @Marko, 메모리 장벽이 JIT에 의해 생성되었지만, 변수가 휘발성임을 나타내는 일부 구문이 바이트 코드에 있어야한다고 생각합니까? 바이트 코드는 비 휘발성과 똑같은데 JVM이 어떻게 휘발성이 있다는 것을 알 수 있습니까? : D – MrROY

+2

변수 자체에 플래그가 있지만 액세스하는 코드에는 없습니다. –

+0

휘발성 변수의 세부 정보를 표시 할 수있는 디 컴파일 도구가 있습니까? – MrROY

1

필드에 volatile을 추가해도 필드를 읽거나 쓰는 Java 바이트 코드는 변경되지 않습니다. 필요한 경우 JVM 또는 JIT 컴파일 출력으로 프로그램의 해석 만 변경합니다. 또한 최적화에 영향을줍니다. 당신은 javap 오른쪽 옵션을 테스트하는 경우

Field flags

Read and Write synchronization

6

는, 플래그 ACC_VOLATILE 볼 수 있습니다 :

javap -v -p Test 

인쇄

:

private static volatile Test t; 
flags: ACC_PRIVATE, ACC_STATIC, ACC_VOLATILE 

(플래그가 jvm spec Chapter 4. The class File Format에 정의 됨)

관련 문제