6

私が使用している Java ドキュメントでは、Object.wait()メソッドが通知されたか偽のウェイクアップであるかに関係なく、メソッドが戻る前に関連するモニターを必要とすることが明確になっています。通常のメソッド リターンの前に、モニターの再取得が行われます。

Object.wait()ただし、イベントが例外をスローした場合に何が起こるかについては、少し明確ではありませんInterrupted Exception。例外をスローする前に、実際にロックを再取得すると推測しています。ただし、ドキュメントはそれについてあまり明示的ではないため、100%確実ではありません...

ここに私が見ているドキュメントがあります: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

それで、私の推論は正しいですか、それとも例外がスローされた後、呼び出し元のコードでモニターの状態に対処する必要がありますか (必要に応じて再取得するなど)?

4

1 に答える 1

5

JLSは、Object#waitの Javadocよりもはるかに詳細にこれを指定します。そのテキストによると、ロックは無条件に再取得する必要があります。関連するビットを引用する:

  1. スレッドtがオブジェクトmの待機セットに追加され、mに対してn 個のロック解除アクションを実行します。

  2. スレッドtは、 mの待機セットから削除されるまで、それ以上の命令を実行しません。スレッドは、次のアクションのいずれかによって待機セットから削除される可能性があり、その後しばらくして再開されます。

    • [...]

    • tで実行中の割り込みアクション。

  3. スレッドtは、 mに対してn 個のロック アクションを実行します。

于 2013-07-08T20:14:12.607 に答える