揮発作品

揮発性の特性:

  1. 揮発性の可視性:揮発性を読んで、合計は、この変数の書き込みの最後を見ることができます。
  2. 揮発性アトミック:揮発性は、例えば、複合操作を除いて、単一のリード/ライトの原子(32ロング、ダブル)を有する:私は++;
  3. JVMは、揮発性のセマンティクスを達成するために、「メモリバリア」を根底にあります。

揮発性メモリセマンティクスの実装:
  JMMで、達成するために、共有メモリを使用して、スレッド間の通信。
揮発性メモリの意味:

    • 揮発性変数を書き込む場合、JMMは、メインメモリに直ちにフラッシュ変数の値を共有スレッドローカルメモリに対応することになります。
    • 揮発性の変数を読むとき、スレッドが無効になっているローカルメモリに対応するJMMなり、共有変数は、メインメモリから直接読み込まれます。

メモリバリアを挿入することによって達成基礎となる揮発性が、コンパイラのため、挿入されたメモリ・バリアの総数はほとんど不可能であるので、JMM保守的戦略最小限にするために最適な配置を発見しました。次のように:

  • 障壁を挿入する上記揮発書き込み動作のそれぞれにおいてStoreStore
  • 各ライトバック動作中の揮発性バリアStoreLoadに挿入されています
  • それぞれが揮発する操作を読んだ後、バリアLoadLoadを挿入
  • 揮発性への各読み出し動作の後にバリアLoadStoreを挿入

StoreStore障壁は、書き込みの前に揮発性を保証書き込まれる以前のすべての一般的には、メインメモリにフラッシュされている;
効果StoreLoad障壁は/バックすべての可能な揮発性の書き込みや揮発性の読み取りを避ける並べ替え書くことです
禁止処理のためにLoadLoad障壁を上記次の一般的な揮発性読み出し及びリオーダ読み出され
、上記と通常の揮発書き込み並べ替えの下を読み取るためにプロセッサを無効にするLoadStoreバリアを

 

volatileキーワードでのJavaは、その各使用前にメインメモリからフラッシュされ、その変更された変数で、すぐにメインメモリに同期させることができます変更された後に修正さが可変で機能を提供します。したがって、あなたは、マルチスレッド操作変数の可視性を確保するために、揮発性使用することができます。

Javaでは、あなたは、複数のスレッド間で秩序ある動作を保証するために同期され、揮発性を使用することができます。実装は異なります。

    1. volatileキーワードは、コマンド再配置を無効にします。
    2. 2、唯一のスレッド操作を可能に同じ時間を確保するためのキーワード同期。同期全能である、彼は同時に三つの特徴を満たすことができ、それはまた、人々の理由同期虐待の多くです。

 

揮発性の原則

1)JMMメモリバリア命令は、次の4つのカテゴリに分類:
StoreLoadの 
障壁は「多目的」障壁である、それはまた、他の三つの障壁の効果を有します。障壁のための最も近代的なマルチプロセッササポート(障壁の他の種類は、必ずしもすべてのプロセッサでサポートされていません)。現在のプロセッサは、一般的に(バッファメモリをリフレッシュするために、バッファ内のすべてのデータを書きたいので、バリアオーバーヘッドの実装は、非常に高価になるだろう 
フルフラッシュ)。
ストア:他のプロセッサに対して可視データ(例:メモリをリフレッシュする)
ロード:メインメモリからデータをリロードし、データキャッシュは失敗してみましょう 
)2 JMMによって開発されたルールテーブル揮発コンパイラを並べ替えるための
第二の並べ替えかどうか動作 
通常の読み出しの最初の動作/揮発性読み書き揮発性書込み 
正常読み取り/書き込みNOない 
NO NO読み取るNO揮発性 
揮発書き込みNO NO 
例を、最後のセルの3行目は、意味:プログラム順に、第1読み取りまたは共通変数に書き込み動作ときに、第2の書き込み動作のような揮発性ならば、コンパイラは、2つの操作を並べ替えることができません。
表から、我々はそれを見ることができない。
第2の動作は、書き込みの揮発性の時間であるとき、関係なく、並べ替えることができない最初の操作が何でありますか。この規則は、前にコンパイルされることはありません揮発書き込み操作を書くために注文した後、揮発性の高いと考えていることを保証します。 
関係なく、第2の動作どのようなしない場合には、最初の操作は、揮発性の読み取りである場合は、並べ替えることができません。この規則は、揮発性の読み出し動作が揮発する前に読むために落胆注文後にコンパイルされないことを保証します。 
*最初の書き込み動作は揮発性、揮発性の第2の操作である場合、読み出し、無並べ替えです。 
JMMメモリバリア挿入戦略(コンパイラ不要なバリアは状況に応じて省略することができる):
*それぞれの前に書き込み動作が揮発性StoreStoreバリアを挿入します。 
*ステートメントようStore1 StoreStore Store2ため、およびその後の書き込み動作がstore2が他のプロセッサに対して可視Store1書き込み動作を確実に行われる前に 
揮発性StoreLoadバリアを挿入するために各書き込み動作において*後に。 
*文LOAD2前にそのようなStore1 StoreLoad LOAD2、及びすべての後続の読み出し動作のためのすべてのプロセッサがStore1可視書くことを確実にするために実行される 
各揮発性読み出し動作の背後にバリアを挿入* LoadLoadを。 
*ステートメントようLOAD1 LoadLoad LOAD2、LOAD2以降のデータがアクセスされ読み出される読み出し動作の前に、データを読み取ることが保証されるためLOAD1が終了読み出される 
各揮発性読み出し動作の背後にバリアを挿入* LoadStoreを。   
*ステートメントようLOAD1 LoadStore Store2ため、およびその後の書き込み動作がstore2ブラシれる前に、データが読み取られることを保証するためには、LOAD1完了が読み取られる 
揮発性、視認性を確保する
  揮発性変数を確実にするために、ローカルメモリリフレッシュメインメモリへの書き込み後可視性
秩序確保するための揮発性の
  秩序を保証するために並べ替えを避けるために、変数揮発性読み書きメモリバリアの前と後に挿入する
揮発性がアトミック保証するものではありません
  揮発性がロックされ、アトミックの独立しました
CPUのタイムスライスは、スレッドのスケジューリングに従っている限り、複数のステップが関与しているとしての動作を実行するので、私は、言って、自然は、原子という保証するものではありません。このため、スレッドの実行が、同じデータベースをロールバックできるようにしません。ステップ1のスレッドが5つのステップを実行する場合は、完全な3ステップ実行CPUは失われ、損失がスケジュールされない場合があり後に、どのようにそれのアトミック性を確保することが可能です。
なぜ、彼らは同期されたため、原子性を保証することができ、同期
、他のスレッドがロックが、このコードの断片を実行し得ることができない、入る限り、彼が実行を完了していないようロックする前に、修正されたコードスニペットを、我々は保証することができ、彼ができるすべての内部コードことそれが実行されます。これにより、アトミック性を確保します。

 

揮発性の例としては、の原子性を保証するものではありません。

/ ** * 10個のスレッドを作成し、私はそれぞれ1000 ++の操作を行います。目的は、*出力10000をプログラムすることである
しかし、結果は10,000未満を複数回です。実際には、これは満たすことができない揮発性原子の理由です。* /  
パブリック クラスのテスト{ 
     公共の 揮発性 のint INC = 0であり; 

    公共 ボイド増加(){ 
         incがある ++ ; 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数)を{
         ファイナルテストテスト= 新しい新しいテスト(); 
         のためのINT I = 0 ;私は、10 <;私は++ ){
         新しい新しいスレッド(){ 
             公共 ボイドRUN(){ 
                 INT J = 0; J <1000; J ++ 
                    test.increase(); 
                }; 
            } .start(); 
        } 
        ながら(Thread.activeCount()> 1)//は実行スレッドに先行することが保証しました終了
            )(Thread.yieldに; 
        のSystem.out.println(test.inc); 
    } 
 }             

 

参考:揮発性の原則

参考:揮発性ワークス

おすすめ

転載: www.cnblogs.com/heqiyoujing/p/11333208.html