Javaブロックされたスレッドはより多くのCPUリソースを占有しますか?
-
29-10-2019 - |
質問
スレッドがブロックされているときにJavaがより多くのCPUリソースを利用するかどうか、つまり、現在別のスレッドによってロックされているモニターのロックを待っているかどうかを尋ねたいと思います。
私は今、モニターのロックを待っているためにいくつかのスレッドがブロックされるスレッドダンプを見ています。それが高いCPU使用について説明責任があるかどうかはわかりません。
ありがとう!
編集(2011年5月6日)この動作が関連しているかどうかについて言及するのを忘れました Java SE 1.4.2.
解決
スレッドは、メモリなどのリソースを消費します。ブロッキング/ブロックスレッドには、1回のコストが発生します。スレッドブロッキング/ウンブロックが毎秒数万回ブロックした場合、これによりかなりの量のCPUを無駄にする可能性があります。
ただし、スレッドがブロックされると、どれだけブロックされているかは関係ありませんが、継続的なコストはありません。
他のヒント
答えはそれほど単純ではありません。ブロックされた状態に入るスレッドがCPUの利用を引き起こす可能性がある場合がある場合があります。
ほとんどのJVMは、階層型のロックアルゴリズムを使用しています。多くの場合、特に短期間保持されているロック用のスピンロックなどのアルゴリズムが含まれます。スレッドがモニターを取得しようとすると、それができないことがわかった場合、JVMは実際にそれをループに入れ、スレッドがコンテキストをすぐに切り替えるのではなく、モニターを取得しようとすることができます。スレッドが特定の数の試行または期間の後にロックを取得できない場合(特定のJVMの実装に応じて)、JVMは「ファットロック」または「膨張ロック」モードに切り替えられ、コンテキストがスレッドを切り替えます。
CPUコストを負担する可能性のあるスピンロックの動作にあります。非常に短い期間ロックを保持するコードがあり、競合が高い場合、CPU使用率にかなりのバンプが表示される場合があります。 JVMが競合のコストを削減するために使用するさまざまな手法に関するいくつかの議論については、参照してください http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.
いいえ、モニターでブロックされているスレッドは いいえ 追加のCPU時間を取ります。
中断またはブロックされたスレッドでは、CPU時間を消費しません。