モニターを適切に処理する方法を理解しようと、JVM 仕様を読んでいました。関連するセクションで提供されている例は次のようになります。
0 aload_1 // Push f
1 dup // Duplicate it on the stack
2 astore_2 // Store duplicate in local variable 2
3 monitorenter // Enter the monitor associated with f
4 aload_0 // Holding the monitor, pass this and...
5 invokevirtual #5 // ...call Example.doSomething()V
8 aload_2 // Push local variable 2 (f)
9 monitorexit // Exit the monitor associated with f
10 goto 18 // Complete the method normally
13 astore_3 // In case of any throw, end up here
14 aload_2 // Push local variable 2 (f)
15 monitorexit // Be sure to exit the monitor!
16 aload_3 // Push thrown value...
17 athrow // ...and rethrow value to the invoker
18 return // Return in the normal case
Exception table:
From To Target Type
4 10 13 any
13 16 13 any
2 番目の例外テーブル エントリが必要な理由がわかりません。によって例外がスローされた場合、monitorexit
本当にモニターを終了したいですか? 私が知る限り、スローされる可能性のある例外はNullPointerException
とIllegalMonitorStateException
です。