5

モニターを適切に処理する方法を理解しようと、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本当にモニターを終了したいですか? 私が知る限り、スローされる可能性のある例外はNullPointerExceptionIllegalMonitorStateExceptionです。

4

2 に答える 2

4

これには、「問題ではない」として閉じられた Java バグがあります - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4414101。(それを見つけてくれた Tom Anderson に感謝します。)

バグの評価セクションは本当に啓発的です。

「非同期」例外の処理について話すことから始めます。つまり、ThreadDeath(非推奨!)Thread.stop()メソッドの実装方法の例外です。JVM がロックを解放しようとしている重要なポイントで「スレッド停止」が発生した場合でも、謎のハンドラーにより、モニターのロックが確実に解放されます。

次に、Neil Gafter 氏は、仮想的な無限ループ (この質問で説明されているように) でさえ、JLS によると正しい動作であると付け加えています。JLS は、スレッドが続行する前にモニターが常に解放されると述べています。それが不可能な場合、スレッドを無限ループに入れることは、他のことをするよりも正しいことです。

于 2013-08-15T13:43:05.260 に答える
0

明確にするために

block 0 :  0 -  3
block 1 :  4 - 10
block 2 : 13 - 16/17
block 3 : 18 

これは無限ループの可能性があるように見えるため、2 番目のブロックに try/catch があると混乱することに同意します。つまり、例外が 13 と 16 の間で発生した場合、それを処理するために 13 にジャンプします。私はどちらかしか推測できません

  • それ自体を保護しようとする、安全で再試行可能な例外があります。
  • あいまいな下位互換性のために保持されています。
  • これには正当な理由はなく、バイトコードの生成方法の人工物です。

私はそれが何の役にも立たないのではないかと思います.Oracleの誰かが同じように疑わしいと思っていますが、それを削除できるかどうかは知りませんでした. ;)

于 2013-08-15T09:41:22.757 に答える