原則の実現の下の同期の「Java並行プログラミングの芸術」

最適化は、ロックを学習する際に、オブジェクトヘッダ(マーク・ワード)があるため、本質的な部分である同期ロックとが存在しているオブジェクトヘッダ内部。32ビットの仮想マシンオブジェクトのヘッダが64ビット(8バイト)を占め、64ビットの仮想マシンアカウントオブジェクトヘッダ128ビット(16バイト)[^ objectHead];レイアウトオブジェクトヘッダの異なるタイプが同じではありません:

  • 配列型:マーク・ワード、クラスのメタデータアドレス、配列の長さ
  • 一般的なタイプ:マーク・ワード、クラスのメタデータの住所

マークWordのオブジェクトを表すハッシュコードまたはロック情報
クラスのメタデータアドレスプロセスのアドレス領域に対応するオブジェクトの種類を示すデータ
配列の長さは(唯一の目的は、アレイである場合のみの存在下での)配列の長さを示します

次のようにデフォルトのオブジェクトヘッダを表現しなければなりません

ロック状態 25bit 4ビット それはバイアスロックであるかどうかを1ビット 2ビットのロックフラグ
ステートレスロック ハッシュコードオブジェクト 世代年齢オブジェクト 0 01

特定のオブジェクトのメモリレイアウトは、参照この記事を

設定JVMによれば1を、以下に示すように、特定の時間の割り当てとは、異なることになります

プロセスは重量ロックをロックするように付勢

あなたは、バイアスロックセットを閉じると、プロセスは、左に行くだろう。そうでない場合は右のプロセスを取ります。

バイアスされたロック

そのため、ほとんどの場合、ほとんどがマルチスレッド競合状態でロックされていない、といつもので、同じスレッドを得る1.6 JVM追加した後にバイアスされ、ロック軽量ロック、そして今、ロック状態の4種類の合計:ステートレスロック偏ったロック軽量ロックロックの重量スレッドでの競争の機能拡張により、ロックが徐々にアップグレードされます(ダウングレードではありません)。
偏った競争なしでロックするCASと軽量ロックは2を必要と一度だけ、この分野における同期性能は、主にバイアスされ、ロックに反映されて向上させることができます。それはどのような場合にはプログラムは有益ではありません、選択肢を比較検討することが必要です。多くの競争場合、失効バイアスされ、ロック・プロセスは、パフォーマンスのボトルネックになるだろう。

バイアスされたロックが利用可能である場合、オブジェクトの初期化ヘッド分配示すように

ロック状態 23bit 2ビット 4ビット それはバイアスロックであるかどうかを1ビット 2ビットのロックフラグ
バイアスされたロック スレッドID エポック 世代年齢オブジェクト 1 01

ロック手順

  1. オブジェクトヘッダときisBiasedは 1であり、ロック状態である01、バイアスされたロックが利用可能で、流れがバックし続けます
  2. スレッドIDを含むターゲット・オブジェクト・ヘッダか否かを判定し、そうでない場合、先にオブジェクトがこのスレッドID CASに直接書き込まれます。この時点で、ロックは終わりました

ロック取り消さ

バイアスされ、ロックの使用に競争がリリース行われるまで、偏ったロックしているスレッドを競合するときに、他ので、メカニズム、スレッドがロックを解除するためにバイアスされたロックを保持します。

  1. 待っロックバイアスを保持している元のスレッド(以下、元のスレッドと呼ぶ)を実行グローバルセキュリティ点(安全点)
  2. 一時停止元のスレッドを
  3. チェック元のスレッドを、スレッドの状態をシンクブロック、重量の偏りの外にあれば、逆に軽量ロックをアップグレード
  4. 復元元のスレッドを

軽量ロック

ロック手順

注:軽量ロックは、操作が正常にCASれていたときに、軽量ロックがロックので、ロック解除時にモーニングコールが起こる、残る; CASの障害とスレッドがすぐにインフレをロックし、ウェイクを待ってブロックします。
芸術のJavaの並行プログラミングの参照ピクチャ

  1. 同期ブロックを入力する最初の、と呼ばれる開かれたロックレコードロックレコードを格納するためのスペース
  2. マークワードの主題ヘッダは、現在のスレッドのスタックにコピー
  3. CAS使用してみてくださいマークのWord 交換がされたロックレコードポインタを指し
  4. 第3のステップは、その後、正常な動作であるマーク・ワードがに設定されている00のステータス、アイデンティティ軽量ロック
  5. そして、身体を同期
  6. 動作の第3の部分は、スピンロックに入る、失敗しました
  7. ロック獲得失敗をスピンする(状態読み取りヘビーロックを変更するために、ロックの閾値、膨張に達する10
  8. スレッドのブロック

ロック解除方法

  1. CASはしようとする所有者のロックのレコードをバックにコピーマークのWord
  2. CAS操作が成功した場合、それは競争に発生がないことを意味し、そうでない場合はステップ3を参照してください
  3. ロックを解除し、待機中のスレッドを覚まします

概要

この章はれる同期主によって制御され、説明したプロセスの種々のグレードおよびJVMにアップグレード対象ヘッドロックの状態のいくつかのレベルを制御します。マーキングによってバイアスロッキングスレッドIDを現在のオブジェクトは、対応するスレッドによって占有されていることを示すために、軽量ロックが交換されるマークWordを通りロックレコードアドレス、現在のスレッドを表現するためには、対応するオブジェクトを保持しています。どんなに、異なるシナリオでさまざまなニーズがあり、ロックの種類、あなたが選択をするために、次の表を参照することはできません

バイアスされたロック:

  • 利点:追加のロックおよびロック解除消費、及びギャップに比べて非同期メソッドを実行するだけナノ秒であります
  • 短所:スレッド間の競合がある場合は、追加コストをもたらすでしょう(バイアスロックの失効)
  • 該当するシーン:シーンに一つだけのスレッド同期ブロックアクセスに適し

軽量ロック:

  • 長所:競合するスレッドが渋滞を引き起こし、手続きの応答速度を向上させることはありません
  • 短所:ロックを取得することはまだできない場合は、スピンを使用してCPUを消費します
  • 該当するシーン:適切なプラクティスの追求、非常に高速なシンクブロックの実行

重ロック:

  • 長所:管理競争のスレッドを使用しない、CPUを消費しません。
  • 短所:スレッドがブロックされ、応答時間が遅いです
  • アプリケーションシナリオ:特定のシンクブロックの実行の追求より遅く

これは、失効プロセス上の総ロックされ、インターネットの拡大は他の操作を見つけるために、


  1. 関連のJVM設定の偏ったロックについて:-XXBiasedLockingStartupDelay = 0が-XXUseBiasedLockingバイアスされ、ロックを有効にするには、数秒後にプログラムを起動表し= falseの手段は、(競争が起こるとき、決定するために設定することができます)偏ったロックを閉じ

おすすめ

転載: www.cnblogs.com/codeleven/p/10963092.html