Javaのvolatileキーワードの実装の原則

可視性の問題を導入するシーン

最初のマップを見て:

上のグラフは、スレッドが、自身の作業メモリ、ならびに共有メインメモリを有し、Javaメモリー・モデルの簡易版です。

スレッド1とスレッド2を使用すると、その値を使用することができます前に、ワーキングメモリにメインメモリ負荷値のデータ変数で始まる、データのデータを読み込むとき。

これが彼らのワーキングメモリへの変更を書き、今そのスレッド1改訂データ変数が1であると仮定します。この時点で作業メモリ、データ値1または0とメインメモリ内のデータの値がスレッド1。スレッド2のワーキングメモリデータ値もゼロです。

これは厄介で、スレッド1とスレッド2は、変数のデータで動作するが、なぜならスレッドローカルキャッシュから、スレッドの変数を変更するデータの一組で、その結果、スレッド2は時間的に見ることができません。

これは、Javaの並行処理であり、問題の可視性スレッドが共有変数の値を変更すると、他のスレッドはすぐにこの修正するかどうかを知ることができます。

これは、上記のJavaメモリモデルは非常に単純化していることは注目に値する、実際の状況ははるかに複雑です。

原理と揮発性の役割

上記の問題の可視性を解決するために、我々は使用することができる揮発性のキーワードを。

volatileキーワードを追加した後、スレッド1が変数の値限り、データを修正し、それは同時に、メインメモリにフラッシュ変更を余儀なくされ、ワー​​キングメモリのデータ変数の値を変更することになります。同時に一方で、スレッド2は、このようたびに、最新の読書の値をスレッド2を確保し、ワーキングメモリにメインメモリの値の更新を強制的にデータ変数を読み取る必要があります。図は次のとおりです。

揮発性の動作原理とは、原則として基本となるJVMの実装では、上記の概念のメモリバリアを必要とします簡単に言えば、顔にJVM 揮発性の時間変数は、それが読み込まれる前に、ロード・バリアを挿入し、その書き込み動作の後に店のバリアを挿入します。

おすすめ

転載: www.cnblogs.com/bluemilk/p/11269505.html