スレッドとJavaのメモリモデル:Java仮想マシンの深い理解

以下は、問題の基本的な原因は、生成された矛盾によって複雑にされています。

 

 これは、命令の再配置の最適化です

1、Javaのメモリモデル

そのメモリアクセスは、さまざまなプラットフォームの下で一貫性のある結果に到達することができますので、Javaプログラムを達成するために、ハードウェアとオペレーティングシステムの違いの様々なメモリアクセスを遮断するために、Javaのメモリモデルの仕様のセットを定義するには、Java仮想マシンの試み。主な目的は、メモリに格納され、変数に、仮想マシンのメモリ、そのような詳細から除去、すなわち、プログラムで変数を定義するモデルのJavaメモリアクセスルールです。Javaのメモリモデルのすべての指定メインメモリに格納された変数は、各スレッドも、スレッドによって使用される変数のコピーのコピーを格納し、独自のワーキングメモリを持っている、すべての変数のためのスレッドがワーキングメモリ内にある必要があり、あなたは直接メインにアクセスすることはできませんメモリ。異なるスレッドが互いにワーキングメモリにアクセスすることができない、メインメモリを介しスレッド間で渡される変数の値が完了しています。下に示すように、ワーキングメモリをメインメモリとの間の関係を、スレッド:

 

高速を得るためには、ワーキングメモリの優先順位は、プログラムは、メイン・アクセス・ワーキングメモリを実行し、レジスタに格納されているか、キャッシュを教えてくれます。対象の仮想マシンのコピーが、それだけでオブジェクト全体をコピーしませんスレッドで使用される参照し、変数をコピーします。ヒープデータを格納することに加えて、仮想マシンを格納するホットスポットmarkword(ハッシュコード格納されたオブジェクト、GCフラグ、GC年齢ロック同期情報)(メタデータ記憶型へのポインタ)のklass点の追加情報オブジェクト

 間2、メモリインタラクション

メインメモリとどのようにワーキングメモリにメインメモリから変数をコピーするには、対話型プロトコルのワーキングメモリ、ワーキングメモリからメインメモリに戻って同期する方法の動作の詳細については、Javaのメモリモデルが8つの操作として定義され、8つの操作はアトミックです切り離せません。

1)メインメモリ変数に作用するロックは、変数は、スレッドを占有するとして同定され

2)主記憶変数の役割をアンロック、変数は、リリースをロックします。

3)メインメモリに作用する変数を読み取り、変数は、後続のロード操作のために、作業メモリに読み込ま。

4)ワークメモリ変数に作用する荷重は、変数がワーキングメモリコピーに読み込まれます

仮想遭遇は、バイトコード命令は、変数の値は、この操作を実行するときに使用する必要があるときはいつでも5)ワークメモリ変数に作用する使用は、それが、可変エンジンを実行するためにメモリの値を渡します。

6)ワーキングメモリに作用する変数を割り当て、作業エンジンは、仮想遭遇するたびに変数代入のバイトコード命令をこの操作を実行するために、可変作業メモリに割り当てられた値を受信します。

7)ワーキングメモリ内の変数の値の効果は、後の書き込み動作するために、メインメモリに転送され、ストアが使用されてもよいです。

8)、メインメモリ、彼はメインメモリ変数にワーキングメモリから取得した変数ストアに作用する書き込み変数

、ロード、ストアの書き込み順序を読み、ペアで現れなければなりません。ワーキングメモリの値で、すなわち変数変数の変更は、メインメモリに同期させる必要があり、最新の割り当て操作を破棄することはできません。スレッドは、メインメモリに割り当てるワークメモリの同期を実現しなかった操作を置くことはできません。

新しい変数が唯一のメインメモリに製造することができ、変数(負荷やアサイン)の操作が直接メモリに初期化されませんを使用することはできません使用され、あなたは前と割り当てストアをロードする必要があります。変数は、同じスレッドがロック操作を複数回行うことができ、一つのスレッドロックすることができます

これは、いくつかのロック、アンロック後にロックを解除するために同じ番号でなければなりません。場合は、変数をロックした後、それはこの値を使用して実行エンジンの前に運転をロードまたはASSINGする必要がある、この変数の彼のワークメモリ値を空にします。書き込みが可変アンロックで実行され、例えばメインメモリストアとして、ワーキングメモリに同期されなければなりません

おすすめ

転載: www.cnblogs.com/xiaofeiyang/p/11979035.html