2013-06-03 9 views
6

मुझे बताया गया है कि volatile कीवर्ड चर के संचालन को लिखने से पहले स्मृति बाधा जोड़ सकता है।जावा में अस्थिर चर को कैसे डिमंपाइल करें?

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

मेमोरी बाधा की अवधारणा जावा विनिर्देश के स्तर पर मौजूद नहीं है। यह कुछ सीपीयू आर्किटेक्चर के निम्न स्तर के कार्यान्वयन विस्तार है, जैसे कि NUMA आर्किटेक्चर जो आज सबसे लोकप्रिय है।

इसलिए आपको एक विशिष्ट JVM कार्यान्वयन के अंदर जस्ट-इन-टाइम कंपाइलर द्वारा उत्पादित मशीन कोड को देखना होगा, जैसे x86 आर्किटेक्चर पर हॉटस्पॉट। वहां, यदि आप x86 मशीन कोड की व्याख्या करने के लिए पर्याप्त कुशल हैं, तो आप मेमोरी बाधा का प्रकटन देखेंगे।

+1

धन्यवाद, @ मार्को, हालांकि स्मृति अवरोध जेआईटी द्वारा उत्पादित किया गया है, मुझे लगता है कि बाइट कोड में कुछ वाक्यविन्यास होना चाहिए ताकि यह संकेत दिया जा सके कि वेरिएबल अस्थिर है, है ना? बाइट कोड गैर-अस्थिर के समान ही है, JVM कैसे पता चलेगा कि अस्थिर है? : डी – MrROY

+2

यह चरम पर एक झंडा है, न कि उस कोड पर जो इसे एक्सेस करता है। –

+0

क्या कोई डिकंपाइल उपकरण मुझे अस्थिर चर का विवरण दिखा सकता है? – MrROY

1

फ़ील्ड में volatile जोड़ना जावा बाइटकोड को बदलता नहीं है जो फ़ील्ड को पढ़ता या लिखता है। यदि आवश्यक हो तो यह केवल 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 

(झंडे हैं जेवीएम स्पेक Chapter 4. The class File Format में परिभाषित)

संबंधित मुद्दे