問題タブ [biased-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
20531 参照

java - Javaでのバイアスロック

フラグを使用したバイアスロックが、-XX:+UseBiasedLocking競合のない同期のパフォーマンスをどのように改善できるかについて読み続けています。それが何をするのか、そしてそれがどのようにパフォーマンスを改善するのかについての参照を見つけることができませんでした。

誰かが私にそれが正確に何であるかを説明できますか、または説明するいくつかのリンク/リソースを私に指摘することができますか?

0 投票する
1 に答える
1217 参照

java - HotSpot JVM でバイアスロックが有効になっている場合、オブジェクトのハッシュコードはどこに保存されますか?

私の知る限り、オブジェクトのハッシュ コードは通常、オブジェクトのヘッダー ワードに格納されます。たとえば、HotSpot では次のようなレイアウトになります。

HotSpotInternals - Synchronization with biased locking enabledによると、ヘッダー ワードのレイアウトは次のようになります。

バイアスロックが有効になっている場合、必要に応じてハッシュコードは実際にどこに保存されますか?

0 投票する
1 に答える
174 参照

java - object.notifyAll() を呼び出すと、Hotspot JVM でロックのリバイアス/インフレが発生しますか?

完全に満足していない (現在の JVM で許可されている場合はバイアスされている可能性がある) モニターを呼び出すとobject.notifyAll()、特にモニターで実際に待機しているスレッドがない場合、モニターのリバイアスやインフレが発生しますか?

0 投票する
1 に答える
629 参照

multithreading - Java は個々のロックを再バイアスしますか?

この質問は、Java がバイアス付きロックを使用するヒューリスティックの 1 つに関するものです。次の段落は将来の読者のためのものです。この質問に答えられる人は、飛ばしても問題ないと思います。

私の知る限り、昔々、Java にはスレッドセーフなクラスがたくさんありますが、そのインスタンスは 1 つのスレッドだけで使用される傾向があることに気付いたので、Sun はそれを利用するためにバイアス ロックを導入しました。問題は、2 つのスレッドから使​​用する必要があるロックを「推測」してバイアスをかけようとすると、競合がなくてもバイアスを元に戻す (「取り消す」) 必要があり、これは非常にコストがかかることです。 JVM はそれを回避しようと懸命に努力します。たとえそれが、偏ったロックが正味の勝利であった可能性がある状況を見逃すことを意味する場合でもです。

また、JVM が「一括」再バイアスを実行し、特定のタイプの多くのすべてのロックを別のスレッドに移行することを決定する場合があることも知っています。この質問はそれに関するものではありません。この質問のために、2 つのスレッドと 1 つのロックしかないとします。(実際の状況はもっと複雑で、スレッド プールが関係していますが、今はそれを無視しましょう。本当に、私はそれについて言及しなかったふりをします。) さらに、スレッド A が「数秒間スリープする」という行に沿って無限ループを実行するとします。 、ロックされた整数をインクリメント、繰り返します。」(それほど役に立たないわけではありませんが、要点を理解するにはこれで十分です。) 一方、スレッド B は同様のループを実行しますが、スリープ時間は数秒ではなく数時間です。さらに、スケジューラが魔法のようであり、競合が発生しないことを保証するとします。

ここで、スレッド A がウェイクアップしてからその整数を正常にインクリメントするまでの平均レイテンシーに関心があるとします。私が理解している限りでは、JVM は最初にロックを A に向けてバイアスをかけ、次にスレッド B が最初に起動したときにバイアスを取り消します。

私の質問は、JVM は最初の推測が基本的に正しいことを認識し、ロックを再びスレッド A に再バイアスするのでしょうか?