[マルチスレッド]-ロックのアップグレードと比較(Javaのバイアスロック、軽量ロック、および重量ロック)

序文

最近、マルチスレッドに関する多くの理論的概念と低レベルの実装を整理しました。ここでは、グラフィックとテキストの組み合わせを使用して、すべての人が理解しやすいようにしています。不明な点がある場合は、メッセージを残してください。 mここではほぼ毎日、あなたはそれを見ることができます。できるだけ早く返信してください。

1.バイアスロック

1.パーシャルロックとは

バイアスロックは、JDK1.6と現在の同期コードの間に競合がない場合に使用されます。Hotspot仮想マシンの設計者は、ほとんどの場合、ロックオブジェクトは複数のオブジェクト間で競合しないだけでなく、常に同じスレッドによって複数回取得されることを発見しました。ロックを取得するスレッドのコストを削減するために、バイアスロックが導入されました。バイアスロックとは、ロックオブジェクトが作成されたばかりのときに、それにアクセスする最初のスレッドにバイアスされることを意味します。このとき、スレッドはオブジェクトヘッダーのバイアスロックのフラグビットを変更してバイアスロックを取得します。その後、スレッドの競合がない場合、バイアスされたスレッドがロックオブジェクトに再度アクセスしたときに、同期はトリガーされません。バイアスロックは、リソースの競合なしに同期ソース言語を排除することにより、プログラムの効率を向上させます。

2.バイアスロックの実現原理

2.1オブジェクトヘッダー

バイアスロックの実装原理について説明する前に、まずオブジェクトヘッダーとは何かを理解する必要があります。

さまざまなインスタンスオブジェクトの操作効率を向上させ、オブジェクト指向機能を強化するために、HotSport仮想マシンは、オブジェクトをオブジェクトヘッダー(ヘッダー)、インスタンスデータ(インスタンスデータ)、および配置パディング(パディング)の3つの部分に分割しますオブジェクトヘッダは、 3つの部分に分かれています。

  1. Markwordは
    、32/64ビット仮想マシンに応じて、ハッシュコード、GC生成期間、ロックステータスマーク、スレッドによって保持されているロック、バイアスされたスレッドID、バイアスされたタイムスタンプなど、オブジェクト自体のランタイムデータを格納するために使用されます、そのサイズは多くの場合32ビットまたは64ビットに分割されます。
  2. Klass
    は主に、オブジェクトが指すクラスメタデータポインターを表すために使用されます。仮想マシンはこのポインターを使用して、現在のオブジェクトがどのクラスインスタンスであるかを判別します。
  3. 配列の長さ
    オブジェクトが配列の場合、オブジェクトヘッダーにも配列の長さを格納する必要があります

バイアスロックの実装では、主にオブジェクトヘッダーのMarkWordを使用します。ここでは、オブジェクトヘッダー(32ビット仮想マシン)のマークワードのストレージ構造を確認します。
ここに画像の説明を挿入

2.2バイアスロックの取得

通常の慣行に従って、バイアスされたロックの取得に関するフローチャートを
ここに画像の説明を挿入
次に示します。以下に、図を見て、小さな構成を記述します。

スレッドが同期されたコードブロックにアクセスすると、この時点でロックオブジェクトが他のスレッドにバイアスされているかどうかが判断されます。

  1. 他のスレッドにバイアスされていない場合、ロックにバイアスされているスレッドIDは、ロックオブジェクトのオブジェクトヘッダーとスタックフレームに格納され、出入りするときにCAS操作をトリガーしてロックおよびロック解除する必要はありません。将来の同期ブロック。
  2. この時点で他のスレッドを優先する場合は、CASを介して競合ロックを操作する必要があります。競合が成功した場合は、バイアスロックのスレッドIDを変更します。競合が失敗した場合は、スレッド間の競合があることを意味します。グローバルセキュリティポイントに到達すると、バイアスロックを取得するスレッドが取得されます。一時停止すると、バイアスロックが軽量ロックにアップグレードされます。(バイアスロックを解除すると、STWはワールドを停止します)

グローバルセキュリティポイント:現時点では実行されているバイトコードはありません

2.3バイアスロックを閉じる

バイアスロックは、JDK1.6およびJDK1.7でデフォルトで有効になっていますが、アプリケーションの起動後数秒までロードされません。必要に応じて、JVMパラメータを変更して遅延をオフにできます。-XX:BiasedLockingStartupDelay = 0 。もちろん、スレッド間の競合が激しいと予測できる場合は、パラメーター-XX:UserBiasedLocking = falseを使用してバイアスロックの使用を直接オフにすることもできます。これにより、プログラムはデフォルトで軽量ロック状態になります。

2.軽量ロック

1.軽量ロックとは

JDK 1.6以降、ロックの取得と解放によって発生するパフォーマンスオーバーヘッドを削減するために、軽量ロックが導入されました。軽量ロックは、スレッド間で競合が発生するが、競合が激しくない場合に使用されます。プログラムの応答速度を向上させるために、ブロックではなく主にスレッドスピンを使用します。

2.軽量ロックの取得

軽量ロックはバイアスロックからアップグレードされます。もちろん、プログラムがバイアスロックを無効にすると、スレッドは同期コードブロックに初めてアクセスするときにデフォルトで軽量ロックを取得します。ここでは、簡単なフローチャートで軽量ロックの取得プロセスを説明します。
ここに画像の説明を挿入

以下の説明は「TheArtof Java ConcurrentProgramming」からのものです。
スレッドが同期コードブロックを実行する前に、JVMは最初に現在のスレッドのスタックフレームにロックレコード(ロックレコード)を格納するためのスペースを作成し、 lockRecord Inのオブジェクトヘッダー内のMarkwordは、正式にはDisplaced Mark Word(置換マーク)と呼ばれます。次に、スレッドはオブジェクトヘッダーのマークワードをCASを介してレコードへのポインターに置き換えようとします。成功した場合、現在のスレッドがロックを取得します。失敗した場合、他のスレッドがロックを競合していることを意味します。現在のスレッドは回転し、次の機会にロックを取得するのを待ちます。

3.軽量ロックのロックを解除します

軽量ロックのロックが解除されると、アトミックCAS操作を使用してDisplaced Mark Wordがオブジェクトヘッドに置き換えられます。成功した場合は競合がないことを意味し、失敗した場合は現在のロックに競合があることを意味します。今回は、軽量ロックが重量ロックに拡張されます。

3、ヘビー級ロック

1.ヘビーウェイトロックとは

Javaでは、同期されたアトミック組み込みロックが提供されます。これは、組み込みロックをモニターとして抽象化することに依存しています(モニターロック)。JDK1.6より前の同期を使用するコストは非常に高く、オペレーティングシステムでミューテックスを直接操作する必要があります。ロック機能を実装するコストは、スレッドの一時停止とウェイクアップの両方をオペレーティングシステムカーネルで完了する必要があることです。パフォーマンスを消費するため、この種のロックはヘビーウェイトロックとも呼ばれます。

2.ヘビーウェイトロックの取得

ヘビーウェイトロックは通常、ライトウェイトロックからアップグレードされます。ヘビーウェイトロックにアップグレードされると、ロックを競合するすべてのスレッドは、競合するロックの待機を同期的にブロックする必要があります。これは、通常の慣行に従った簡単なフローチャートです。

ここに画像の説明を挿入

第四に、ロックのアップグレードと特徴

JDK1.6の設計者は、さまざまなスレッド競合レベルで同期ロック戦略を解決するために、バイアスロック、アダプティブスピンロック、軽量ロックの導入など、同期のための一連の最適化を行いました。現在、synchronizedのパフォーマンスはreentrantlockのパフォーマンスに匹敵し、Javaの関係者でさえ、同期戦略としてsynchronizedキーワードを推奨しています。非常に多くの人々が、さまざまなロックがどのように変換されるか、およびさまざまなロックのアップグレードプロセスについて知りたいと思うでしょう。本日の終わりに、ロックの関連する特性を要約します。

1.ロックのアップグレード

ロックのアップグレードプロセスは、簡単なフローチャートで説明され
ここに画像の説明を挿入
ています。私が描いた絵を見ると、私は本当に元気です、ハハハハハハハハハ。
上の図は基本的にロックアップグレードの全過程をまとめたもので、アップグレード条件も示されています。わからない場合は、コメント欄にメッセージを残すか、プライベートメッセージを送ってください〜

2.ロックの特徴

1.ロックフラグ

ロックアップグレードの過程で、ロックフラグの概念が言及されます。ロックフラグは実際にはオブジェクトヘッダーのマークワードに格納されます。ここでは、「JavaConcurrent」で32ビット仮想マシンのオブジェクトヘッダーを参照できます。プログラミングアート」フラグステータス変更テーブル(私はこのテーブルを描くのが面倒です。本のテーブルは直接接着されています):
私はこの絵を描くのが面倒です。本に元の絵を貼り付けるだけです。

2.ロックの比較

ロックの長所と短所について簡単に説明します。

バイアスロック

  1. 利点:ロックをロックおよび解放するために追加の操作は必要なく、非同期メソッドの実行間のギャップはナノ秒単位です。
  2. 短所:バイアスロックを軽量ロックにアップグレードすると、stwがラグを引き起こす原因になります
  3. 該当するシナリオ:1つのスレッドのみが同期ブロックにアクセスします

軽量ロック:

  1. 利点:スレッドのブロックを引き起こさず、スレッドのスリープとウェイクアップを待つ必要がなく、プログラムの応答速度が向上します。
  2. 短所:過度のスピンは余分なCPU消費をもたらします
  3. 該当するシナリオ:応答時間を追求して、同期ブロックの実行速度は非常に高速です

ヘビーウェイトロック:

  1. 利点:スレッドの競合はスピンする必要がなく、CPUを消費しません
  2. 短所:スレッドのブロック、応答時間の遅延
  3. 該当するシナリオ:スループットの追求、より長い同期ブロックの実行

さて、私がロックのアップグレードと比較について考えた知識のポイントはここにあります、そしてやりがいのある友人は彼らがワンクリックと3回連続してブロガーに励ましを与えることができることを望んでいます!
Sanlianの友達が昇進して給料を上げてBaiFumeiと結婚できることを願っています。

おすすめ

転載: blog.csdn.net/xiaoai1994/article/details/111478435