2013-06-03 4 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, которая является самой популярной сегодня.

Поэтому вам нужно будет посмотреть машинный код, созданный компилятором Just-in-Time внутри конкретной реализации JVM, такой как HotSpot для архитектуры x86. Там, если вы достаточно квалифицированы для интерпретации машинного кода x86, вы увидите проявление барьера памяти.

+1

Спасибо, @Marko. Хотя барьер памяти создается JIT, я думаю, что должен быть некоторый синтаксис в байтовом коде, чтобы указать, что переменная является изменчивой, не так ли? Байт-код так же, как и энергонезависимый, как JVM может знать, что он нестабилен? : D – MrROY

+2

Это флаг самой переменной, а не код, который обращается к нему. –

+0

Есть ли какой-нибудь инструмент для декомпиляции, который может показать мне детали изменчивой переменной? – MrROY

1

Добавление volatile к полю не меняет байт-код Java, который читает или записывает это поле. Он меняет интерпретацию программы только с помощью JVM или JIT-компиляции. Это также влияет на оптимизацию.

Field flags

Read and Write synchronization

6

Если вы проверить его с javap и правильных вариантов, флаг ACC_VOLATILE видно:

javap -v -p Test 

печати:

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

(флаги определенная в спецификации jvm Chapter 4. The class File Format)

Смежные вопросы