揮発性の基盤となるJavaのマルチスレッドの実装の原則

おそらく、あなたは頻繁に尋ねましたか?

volatileキーワードの役割は何ですか?

これらのアクションの基本的な実装を達成するためにどのように?

揮発ことへの保証の可視性と秩序ありますか?アトミックのセックス?

序文

Javaで使用されるように我々はすべて知っているように、Javaコードは、JVM、JVMバイトコード実行にロードされたバイトコードのクラスは、CPU上で、最終的なアセンブリ命令の実行に変換する必要がありますJavaバイトコードにコンパイルされますメカニズムは、同時JVMの実装とCPUの命令に依存しています。

揮発性の役割

  揮発性のJava言語仕様バージョン3の定義は、以下:Javaプログラミング言語だけでは、この変数を介して取得する排他ロックを保証しなければならないアクセスへのスレッドが共有変数を確保するために、変数を共有することができます正確かつ一貫してスレッドを更新することができます。私たちは理解して、次のチャートを見てください。2 CPUは、彼らが彼らのCPUのキャッシュにメインメモリ変数カウンタを読み、[操作データ,,メインメモリ操作カウンターに変数を行かなければなりません。CPU1カウンタ= 7の動作を変更する、CPU2には見えません。

揮発性の基盤となるJavaのマルチスレッドの実装の原則

可視性を実現

私たちは基礎となる実際には揮発性のキーワードを追加する場合は、上記の例では、これがそうです。

1)現在のプロセッサのキャッシュラインのデータがバックシステムメモリに書き込まれます。

データキャッシュメモリアドレスにつながることができ、メインメモリ処理へ2)書かれたバックは、他のCPUで、CPUは、我々は、メインメモリからデータを取得する必要が他の時間を実行するのに有効ではありません。

命令並べ替えの禁止を達成

     禁止指令重排序有没有什么例子?可以参考下我的另一篇文章:  DCL的单例一定是线程安全的吗 

すべての命令は、Javaメモリモデルが実際にメモリ・バリア(メモリバリア)並べ替えによって実装されているメモリバリアはメモリバリアの前に得ることができた後、メモリバリアの前に、すべての書き込み操作は、バックメインメモリへのすべての読み取り操作を記述する必要があります禁止されています(可視の)操作の最新の結果を書き込みます。

バリアタイプ指示図
LoadLoad LOAD1; LoadLoad; LOAD2はLOAD1読み出し動作の前におよびその後の読み出し動作LOAD2行わ確保
StoreStore Store1; StoreStore; Store2は、書き込み動作がstore2前及び後に行われるstore1書き込み動作のリフレッシュを確保メインメモリに
LoadStore LOAD1; LoadStore; store2書き込み操作がLOAD1読み出し動作が読み取り終了したことを確認する前とstroe2後に実行される
StoreLoadを; StoreLoadのstore1をLOAD2 store1書き込み動作はメインメモリ、LOAD2にフラッシュされたことを確認した後と読み取り動作の後に実行します

例えば、オブジェクトのインスタンスに書き込み、StoreLoadを加えた後、StoreStoreを添加する前に。

VMは、メモリ・バリア(メモリバリア)技術は、MESIプロトコルに従うことですベンダー。その他の不当な仮想マシンのベンダーは、他の技術を持っているだけでなく、MESIプロトコルに従う必要があるかもしれません。

MESI状態4の最初の文字を指します。各キャッシュ・ラインは、ビット2で表される四つの状態は、使用できる状態になっている、彼らは以下のとおりです。

これは実際には、メインメモリ、キャッシュプロトコルMESIプロトコルとCPUである理由おそらく、あなたが尋ねるかもしれませんが、私は開始し、崔はそれを言った、コンテンツの多くは、学生が勉強したい、あなたは百度を所有することができます

概要:揮発性実装するJavaメモリモデルの可視性と秩序、それは保証アトミックに揮発できながら、これらの二つの特徴は、メモリバリアによって達成されているのです。(順序の問題はコンパイラの最適化によって引き起こされているので、キャッシュの可視性は矛盾に起因する問題であり、そして、原子、スレッド切り替えの問題が原因で発生し)

おすすめ

転載: blog.51cto.com/dwp111/2480845