次の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
こんにちはPeterさんの答えは、「コードがなぜ生成されたのか不思議です。しかし、あなたの参加に感謝します。 – chuacw
ロックを解除するコードが必要なのでコードが生成されます。私の例を参照してください。あなたは私の説明しようとしなかった。 ;) –
ルネの説明が良いです。また、私は別の方法を求めなかったことに注意してください。とにかくありがとう。 – chuacw