Мне сказали, что ключевое слово 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