私はvisualVMを使用してマルチスレッドJavaアプリケーションに接続します。スレッドには、実行中、スリープ中、待機中、監視の4つのステータスがあります。この監視ステータスはどういう意味ですか?待機と監視の違いは何ですか?
回答:
これらの状態は、Thread.State
列挙型で言及されているものと同じです。「待機」とは、ドキュメントに記載されているとおり、次のことを意味します。
次のいずれかのメソッドを呼び出したため、スレッドは待機状態になっています。
- タイムアウトなしのObject.wait
- タイムアウトなしのThread.join
- LockSupport.park
「モニター」は、BLOCKED
スレッドがオブジェクトのロックを取得するのを待機している状態です(synchronized
別のスレッドがすでに関連付けられたロックを保持しているときに、ブロックまたはメソッドに入ろうとしているため)。
sleeping
との違いは何waiting
ですか?!
モニターは、スレッドがオブジェクトのロックを取得するのを待機していることを意味します。たとえば、あるスレッドが同期されたメソッドを実行していて、別のスレッドが同じオブジェクトでそれを呼び出そうとすると、メソッドの最初の呼び出しが終了するまで、そのスレッドは実行できません。これは、最初のスレッドがそのオブジェクトにモニターまたはロックを持っているため、2番目のスレッドは解放されるまで待機する必要があるためです。
「同期は、組み込みロックまたはモニターロックと呼ばれる内部エンティティを中心に構築されます。(API仕様では、このエンティティを単に「モニター」と呼ぶことがよくあります。)組み込みロックは、同期の両方の側面で役割を果たします。オブジェクトの状態と確立は、可視性に不可欠な関係の前に起こります。」