2013-08-28 6 views
7

私は同期されたvolatile変数がjavaでどのように動作するかを調べています。この用語の意味を理解できる人は誰でも同期ブロック内の読み込み障壁と書き込みバリアは何ですか

+4

とコンセプトを実証したいあなたは[1787450](http://stackoverflow.com/questions/1787450)を見てみました? – ADTC

+0

これを見てください:http://stackoverflow.com/questions/1787450/how-do-i-understand-read-memory-barriers-and-volatile – Saint

+0

本当に有用なものです。ありがとうございました – csk

答えて

0

コードの同期ブロックを入力すると「読み込みバリア」を渡し、終了すると「書き込みバリア」を渡します。

Isは、揮発性属性を参照する際に使用され、スレッドがvolatile属性の値を更新する必要がある場合に通知します。他の誰かが書き込み障壁を通過した場合、読み取りバリアを通過するときに更新する必要があります。

volatile属性から同様の読み込みを行うと、読み込みバリアが渡され、volatile属性に書き込むと書き込みバリアが渡されるため、同期ブロックよりはるかに粒度が大きくなります。

2

メモリバリアは、コンパイラが特定の最適化を行えないようにする概念的な "行"であり、特別な "同期アップ"コマンドをプロセッサに挿入することができます。通常、コンパイラは特定のメソッドを調べて、コードの意味を変えずに特定の命令を移動できることを確認できます。たとえば、あなたが

int x = 0, y = 0; 
x++; 
y++; 

を持っている場合、コンパイラはxyがするように、いくつかのクラスのフィールドである場合に、しかし

y++; 
x++; 

のためのいくつかの利点、それは可能性の代わりに、出力コードがあったことを考え出した場合それらは他のスレッドから見ることができ、他のスレッドはメソッドが実行されている間に値を変更している可能性があります。

メモリバリアは、特定の変数(Javaの場合、volatileクラスとAtomic*クラス)の値を再検査するよう強制します。メソッドが実行されている間に他のスレッドがそれらを変更した場合、コンパイラーが誤って計算の結果を変更する可能性のある並べ替えを作成しないようにします。複数のコア/プロセッサをサポートするシステムでは、コンパイラは他のプロセッサやハードウェアデバイスがその間に変数を変更していないことを確認するようにプロセッサに強制します。 Java(Java 5の場合)は、この動作の仕組みについて非常に明確に定義された規則セットを持っています。happens-beforeと呼ばれています。

This FAQには、Javaメモリモデルの開発時に書かれた有用な説明があります。メモリバリアの概念はクロスランゲージですが、ほとんどの言語ではJavaについてのルールが明確に定義されていないことに注意してください。

+0

ほとんどの良い答えが、メモリバリアは単なるコンパイラの概念ではなく、ハードウェアの概念でもあります。プロセッサには、他のスレッド(同じシステム内の他のプロセッサ上で実行中)で行われたメモリへの更新が表示されないようにするローカルキャッシュを持つことができます。特定のプロセッサ命令を使用してこれらのキャッシュをフラッシュしたり、リードスルー/ライトスルーのセマンティクスを強制することができます。 – davmac

+0

良い点、それを反映するように編集します。 (最近キャッシュに入れられていないプロセッサであまりにも多くの時間を費やしていた...) – chrylis

0

JVMが最低レベルでJavaメモリモデルのセマンティクスを実装するために、読み書きバリアが使用されています。

ただし、この用語はJava言語仕様にはありません。理由はという理由で、の関係の前にのみ発生します。特定

  • に揮発性変数への書き込みが発生し、前
  • 同じ変数の後続の読み取り同期ブロックが発生し、前と同じsyncchronizedブロック

の後続のエントリ出プログラム内の2つのアクションの間に先起こりの関係が存在する場合、その2つのアクションが順不同の順序で実行されるという保証があります。

JVMの実装の詳細を調べることで、正しいマルチスレッドプログラムを記述する必要はありません。しかし、もしあなたが詳細を知りたいのであれば、JSR-133 cookbookはおもしろいです。

5

(上記の答えはかなり完了している)、私は単純なスキーム

Thread 1                Thread 2 


    |   
    |                  
    |                  | 
    |                  | 
    | Everything Thread 1             | 
    | wrote before here             | 
    |                  | 
    |                  | 
    _ _ _ _ _ _ _ _ _ _             | 
     (write barrier)   (happens before)   (read barrier) | 
    |              _ _ _ _ _ _ _ _ 
    | 
    |             is guaranteed  | 
    |             to be visible to | 
    |             Thread 2   | 
    |                  | 
関連する問題