(2)並行プログラミングのJavaの原則の芸術的な実現の基礎となる同期および揮発性

揮発性の定義と実装

Javaプログラミング言語は、アクセスのスレッドが共有変数を、変数が正確で一貫性のある最新情報を確実にするために共有することができることができ、排他ロックのスレッドだけでは、この変数を介して取得する必要があります。フィールドがvolatile宣言されている場合は、Javaのスレッドのメモリモデルは、すべてのスレッドがこの変数の値が同じであることを保証参照します。

ロックプレフィックス

読み書きするように変更volatile変数は、変数を共有し、JVMは、命令プリフィックスロックマルチコアCPUのプロセッサは、以下の二つ上げ、プロセッサにロックプレフィックス命令を送り、
(1)現在のプロセッサのキャッシュラインをシステムメモリへのデータバックは
(2)この操作は、メモリアドレスに他のCPUのキャッシュデータにメモリに書き戻されることは有効ではありません。
処理速度、メモリを増加させるため、プロセッサに直接通信しないが、最初のシステム・メモリは、データを操作する前に、内部キャッシュ(L1、L2又はその他)を読み取ることが、動作を終了知っているとき、メモリ書き込みではありません。あなたが宣言した場合、揮発性の変数が書き、JVMは、プロセッサに送信されますロックプレフィックス命令この変数のデータ・キャッシュ・ラインをシステム・メモリに書き込まれ、。別のプロセッサの場合はキャッシュ値か、古い、その後、計算や操作上の問題を行います。したがって、マルチスレッドプログラミングでは、同一の各プロセッサ・キャッシュの値を確保するために、それがあろうコヒーレンシをキャッシュする場合、バスで走行データを盗聴することによって日付の独自のキャッシュの値かどうかを確認するために、各プロセッサ自身がメモリアドレスに対応するラインキャッシュプロセッサ発見が変更されたデータ変更動作のプロセッサは、システムは、読み出しデータメモリプロセッサから再う場合、現在のキャッシュラインは、プロセッサを非アクティブに設定されますキャッシュ。

2の原則の揮発性の実現

(1)ライトバックキャッシュメモリとプロセッサ原因ロックプレフィックス命令
(2)プロセッサのキャッシュが原因他のプロセッサのキャッシュメモリ無効に書き戻されます

同期の実装の原理と応用

Javaで各オブジェクトには、ロックとして使用することができます。
(1)通常の同期方法については、ロックオブジェクトの現在のインスタンスである
静的同期方法(2)、ロックが現在のクラスのクラスオブジェクトである
ブロックの同期方法(3)、オブジェクトがロックブラケット構成を同期されます。
同期ブロックにアクセスするときにスレッドを試み、彼は最初のロックを取得する必要があり、例外がスローされたときに、ロックが解除または起動する必要があります。

Javaオブジェクトヘッダ

ロックは、Javaオブジェクトの存在を事前に同期しています。
組成物ヘッダマークWordやクラスのメタデータアドレスアレイ長又は

マーク・ワード

デフォルトのストレージオブジェクトのハッシュコード、世代、年齢とフラグ。
32 JVMマークWordのデフォルトのストレージ構成テーブル

ロック状態 25bit 4ビット それはロック付勢されているか否かを1ビット 2ビットのロックフラグ
ロックフリー状態 hashCodeオブジェクト 対象の世代の年齢 0 01

動作中に、マーク・ワードに格納されたデータは、ロックフラグに応じて変化します。
マークワードテーブル状態変更
ここに画像を挿入説明
仮想マシン64に、64ビットのマークワードサイズ、ストレージ構成テーブル
ここに画像を挿入説明

JVMの原則の実現に同期

JVMは、入口および出口に基づいてモニタは、オブジェクトコード同期およびブロック同期の方法を実施するために、両方の実装は同じではありません。同期方法で、モニタは、命令を入力し、monitorexit用いて同期コードブロックは、別の方法で使用されています。
monitorenter命令が同期コードの開始位置にコンパイルされ、ブロック内に挿入され、monitorexitは、それぞれ対応するペアmonitorexitを有していなければならないことを確実にするための方法および例外、JVMのmonitorenterの端部に挿入されます。任意のオブジェクトを有するモニターそれに関連し、そして場合、モニタ保持された後は、それがロックされています。monitorenter命令にスレッドの実行は、ロックオブジェクトを取得しようとしているモニターに対応するオブジェクトの所有権を取得しようとしたとき。

スピンロック

これは、ロックが他のスレッドによって取得された場合、スレッドはロックを獲得するための時間を指すロックが取得されるまで、スレッドはループを終了し、サイクルを待ち、その後ロックが正常に取得されているかどうかを判断し続けます。

CASアルゴリズム

即ち、比較およびスワップ(比較およびスワップ)は、周知のロックフリーアルゴリズムです。スレッドが存在しない場合に変数を同期している複数のスレッド間で使用していないロック変数の同期がブロックされたときであるロックフリーのプログラミングは、それはまた、非ブロッキング同期(非ブロック同期)と呼ばれています。CASアルゴリズムは、3つのオペランドを必要とします

読み込みする必要があり、書き込みメモリ値V

比較値A

Bは、新しい値を書き込もう

その値がV原子方法の値を更新して、新しい値を持つV A、CAS Bに等しい場合にのみ、それが任意の操作を実行しない場合(比較及び置換がアトミック動作です)。通常、スピン動作、すなわち連続的に再試行。

公開された24元の記事 ウォンの賞賛1 ビュー549

おすすめ

転載: blog.csdn.net/qq_45366515/article/details/105116001