JMMレビュー

Javaのメモリモデル

Java仮想マシンの仕様は、Javaメモリモデルを定義します(Javaのメモリモデル、JMM)

JMM主な目的は、即ち、メモリに記憶された変数に、仮想マシンのメモリ変数から取り出し、変数のプログラムにアクセスルールを定義することです。変数は、以下が挙げられる:インスタンスフィールド、静的フィールドとオブジェクトを構成する配列要素を、後者がプライベートであるような方法は、ローカル変数およびパラメータが含まれていない、共有されていない、競争の問題はありません

JMMが提供するすべての変数は、メインメモリ(メインメモリ)に格納され、各スレッドは、独自のワーキングメモリ(作業記憶)が、ワーキングメモリのスレッドは、メインメモリコピーに保存されている変数にスレッドを使用することです。(など読んで、割り当て、)変数上のすべての操作をスレッドワーキングメモリである必要がありますが、直接メモリ内の主な変数を読み書きすることはできません。異なるスレッド間で直接他の変数のワーキングメモリにアクセスすることができない、スレッド間で渡される変数の値は、メインメモリを完了するために必要とされています。

Javaヒープ内のメインデータ部に対応するメイン・メモリ・オブジェクト・インスタンス、仮想マシンの一部が対応するスタックのワーキングメモリ領域

メインメモリ及び作業メモリの相互作用の間に、JMMが完了するのに8つの動作を定義し、各操作がアトミックである:ロック、UNLO​​CK(排他スレッド状態として識別される変数を追加し、ロック変数のメインメモリに作用します) (ロック状態へ変数が解除されるロック解除メインメモリ変数に作用する変数の放出が他のスレッドによってロックすることができた後、)、(リード)を読み取り、負荷(荷重)、利用(使用)、ASSIGN (割り当て)、格納(記憶)、ライト(書き込み)。JMMオペレータのみが順次実行される必要はなく、連続的に行うことが保証されていません

ロック:(1)同時に変数がそのロックを動作させる唯一のスレッドを可能にするが、ロック操作を繰り返しロックした後、スレッドで複数回繰り返すことができ、ロック解除操作変数のみの同じ数を実行しますこれは、ロックが解除されます。

          (2)あなたは、変数にロック操作を行うと、それは、この変数ワーキングメモリの値がクリアされます。この変数を使用して実行エンジンに先立って、我々は、再実行する必要がありますまたは割り当て値のロード操作は、変数を初期化します。

          (3)変数に対してロック解除操作を実行する前に、この変数は、再び第1のメインメモリに同期されなければならない(実行ストア、書き込み動作)

 

特別には揮発性の型変数をルール

volatileキーワードは、JVMによって提供される最も軽量な同期メカニズムであると言うことができます

特徴は:1つのスレッドがこの変数の値を変更した場合、すべてのスレッドのために、この変数の可視性を確保するために、他のスレッドに新しい値をすぐに習得することができます各スレッドのワーキングメモリでは、揮発性の変数も存在矛盾することができますが、彼らはそれぞれの使用前に更新する必要があるため、実行エンジンが矛盾を見ることができない、何の整合性の問題が存在しないと考えられます。ので、このアクションは、メインメモリへのCPUのキャッシュへの書き込みをロックすることであると、書き込み操作がキャッシュを無効に別のCPUコアやその他の原因となります、キャッシュ変数にこの操作が対応するが、以前に作られた説明」店舗書き込み「動作のため、この動作により、フロント揮発性変数を可能にする他のCPUに直ちに目に見える変化

二つの特徴:並べ替え、すべての操作の前に、同期メモリ手段を変更するためのロック命令の実行が完了したとき、コマンドの並べ替え、最適化を禁止するには、次の命令がメモリバリア手段の前の位置に並べ替えることができないので、形成、 「命令の並べ替えメモリ関門を通過することはできません」効果

 

同時プロセス、可視性と秩序をどのように扱うかのJMM原子

原子性:JMM動作保証の変数はアトミック読み取り/ロード/割り当て/使用/含まれているため店舗/書き込みを、 私たちが考えることができる基本的なデータ型は読んだことがあると書き込みアクセスがアトミックですシーンが保証アトミック性の大きな範囲を必要とする場合、JMMも暗黙的にこれら2つの操作を使用して、命令バイトコード、この需要を満たすために、ロックとアンロック操作にmonitorenterとmonitorexitのより高いレベルを提供し、反射Javaコードは、キーワードシンクブロック同期、従ってにある操作ブロックも不可分の間で同期を含みます

可視性:可視性は、スレッドが共有変数の値を変更したときに、他のスレッドはすぐにこの変更を知ることができるですJMMは通常または揮発性変数が変数であるかどうか、可視性を実現するために、変数を更新するには、メインメモリから伝達媒体への道としてメインメモリに依存し、この変数の値を読む前に、変数に新しい値の後に変更することで、メインメモリに背を同期さ場合、通常の変数とすることをvolatile変数間の差である特別なルール揮発性の保証、新しい値がすぐにメインメモリに同期して、すぐに各使用前にメインメモリからリフレッシュを変数を操作するマルチスレッド時に平均変数がこれを保証することはできませんが、いくつかあるので、それは、揮発性の保証、視認性と言うことができます。同期と可視性の最終的な実現。視認性シンクブロックで同期化されて得られたルール「変数に対してロック解除操作を実行する前に、この変数は、再び第1のメインメモリに同期されなければならない」、および最終的なキーワード手段の視認性:最終変更されたフィールド初期化が完了ビルダーしたら、あなたは他のスレッドでは、フィールドの最終値を見ることができます

秩序:synchronizedキーワードは、ルールによって得られる「は、そのロック操作する唯一のスレッドを可能同時に変数」で、このルールは、2つのシンクブロックが同じロックを保持決定のみシリアルすることができます入力します。

 

おすすめ

転載: www.cnblogs.com/xiaofan156/p/11878624.html