Tôi đã được thông báo rằng từ khóa volatile
có thể thêm hàng rào bộ nhớ trước khi ghi hoạt động của biến. Vì vậy, tôi viết mã:Làm thế nào để dịch ngược biến dễ bay hơi trong 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();
}
}
Và sau đó dịch ngược nó:
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
}
Tôi không thể nhìn thấy bất cứ điều gì liên quan đến rào cản bộ nhớ, và sau đó tôi loại bỏ các volatile
và ngược lại, các mã byte không thay đổi chút nào.
Làm cách nào tôi có thể tìm thấy bất kỳ thứ gì trong mã byte?
Cảm ơn, @Marko, Mặc dù rào cản bộ nhớ được sản xuất bởi JIT, tôi nghĩ rằng cần có một số cú pháp trong mã byte để cho biết biến là dễ bay hơi, phải không? Mã byte chỉ giống như non-volatile, làm thế nào JVM có thể biết có một biến động? : D – MrROY
Đó là một lá cờ trên biến, không phải trên mã truy cập vào nó. –
Có công cụ dịch ngược nào có thể chỉ cho tôi chi tiết biến dễ bay hơi không? – MrROY