14

スレッドがブロックされたとき、つまり現在別のスレッドによってロックされているモニターをロックするのを待っているときに、Javaがより多くのCPUリソースを使用するかどうかを尋ねたいと思います。

私は現在、モニターのロックを待機しているために一部のスレッドがブロックされるスレッドダンプを調べていますが、それがCPU使用率の高さの原因であるかどうかはわかりません。

ありがとう!

編集(2011年5月6日)この動作がJavaSE1.4.2に関連するかどうかについて言及するのを忘れました。

4

4 に答える 4

27

スレッドはメモリなどのリソースを消費します。スレッドのブロック/ブロック解除には、1回限りのコストが発生します。スレッドが1秒間に数万回ブロック/ブロック解除する場合、これはかなりの量のCPUを浪費する可能性があります。

ただし、スレッドがブロックされると、ブロックされている期間は関係なく、継続的なコストは発生しません。

于 2011-05-05T10:14:21.460 に答える
19

答えはそれほど単純ではありません。ブロック状態になったスレッドがCPU使用率を引き起こしてしまう場合があります。

ほとんどのJVMは、階層型ロックアルゴリズムを採用しています。多くの場合、特に短時間保持されるロックの場合は、スピンロックなどのアルゴリズムが関係します。スレッドがモニターを取得しようとして、それができないことを検出すると、JVMは実際にモニターをループに入れ、コンテキストがモニターをすぐに切り替えるのではなく、スレッドにモニターの取得を試行させる場合があります。スレッドが特定の試行回数または期間(特定のJVM実装に応じて)後にロックの取得に失敗した場合、JVMは「ファットロック」または「インフレートロック」モードに切り替わり、コンテキストスイッチがスレッドを切り替えます。

CPUコストが発生する可能性があるのは、スピンロックの動作です。非常に短時間ロックを保持するコードがあり、競合が多い場合は、CPU使用率が大幅に上昇する可能性があります。JVMが競合のコストを削減するために使用するさまざまな手法に関するいくつかの説明については、http://www.ibm.com/developerworks/java/library/j-jtp10185/index.htmlを参照してください

于 2011-05-06T00:44:14.920 に答える
4

いいえ、モニターでブロックされているスレッドは、追加のCPU時間を消費しません。

于 2011-05-05T10:08:25.930 に答える
1

中断またはブロックされたスレッドはCPU時間を消費しません。

于 2011-05-05T10:10:22.090 に答える