以下Java代碼會生成以下JVM字節碼。同步塊中的意外代碼
我很好奇爲什麼生成從偏移量31到偏移量36的代碼。 JLS7或JVM7規範中沒有提到這一點。我錯過了什麼嗎?
即使我刪除println語句,由於println調用已被刪除,代碼(偏移31到偏移量36)仍然會生成,只能在較早的位置生成。
// 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 2012-04-01 00:33:51
代碼生成是因爲必須有代碼才能釋放鎖,請參閱我的示例。你錯過了我的解釋嘗試。 ;) – 2012-04-01 07:44:24
雷內的解釋比較好。另外請注意,我沒有要求其他方法。不管怎麼說,還是要謝謝你。 – chuacw 2012-04-02 00:58:27