4

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

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

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

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

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

4

1 に答える 1