निम्न जावा कोड निम्न JVM बाइटकोड उत्पन्न करता है।सिंक्रनाइज़ ब्लॉक में अप्रत्याशित कोड
मुझे उत्सुकता है कि 31 ऑफसेट से कोड 36 ऑफसेट करने के लिए क्यों उत्पन्न होता है। जेएलएस 7 या जेवीएम 7 विनिर्देशन में कुछ भी इस बारे में बात नहीं करता है। क्या मैं कुछ भूल गया?
भले ही मैं println स्टेटमेंट को हटा दूं, कोड (36 ऑफसेट करने के लिए ऑफसेट 31) अभी भी पहले के स्थान पर उत्पन्न हो गया है, क्योंकि प्रिंटल कॉल हटा दिया गया है।
// Java code
void testMonitor() {
Boolean x = new Boolean(false);
synchronized(x) {
System.out.println("inside synchronized");
System.out.println("blah");
};
System.out.println("done");
}
// JVM bytecode
Offset Instruction Comments (Method: testMonitor)
0 new 42 (java.lang.Boolean)
3 dup
4 iconst_0
5 invokespecial 44 (java.lang.Boolean.<init>)
8 astore_1 (java.lang.Boolean x)
9 aload_1 (java.lang.Boolean x)
10 dup
11 astore_2
12 monitorenter
13 getstatic 15 (java.lang.System.out)
16 ldc 47 (inside synchronized)
18 invokevirtual 23 (java.io.PrintStream.println)
21 getstatic 15 (java.lang.System.out)
24 ldc 49 (blah)
26 invokevirtual 23 (java.io.PrintStream.println)
29 aload_2
30 monitorexit
31 goto 37
34 aload_2
35 monitorexit
36 athrow
37 getstatic 15 (java.lang.System.out)
40 ldc 51 (done)
42 invokevirtual 23 (java.io.PrintStream.println)
45 return
हैलो पीटर, आपका उत्तर इस सवाल का जवाब नहीं देता है: "मुझे उत्सुकता है कि कोड क्यों उत्पन्न होता है" या यहां तक कि "क्या मुझे कुछ याद आया?"। यद्यपि आपकी भागीदारी के लिए धन्यवाद। – chuacw
कोड जेनरेट किया गया है क्योंकि लॉक को रिलीज़ करने के लिए कोड होना है, मेरा उदाहरण देखें। आपने व्याख्या करने के अपने प्रयास को याद किया। ;) –
रेन की व्याख्या बेहतर है। साथ ही, ध्यान दें कि मैंने वैकल्पिक तरीके से नहीं पूछा था। फिर भी धन्यवाद। – chuacw