著作権:LeifChenの元、ソースを明記してください、ありがとう〜https://blog.csdn.net/leifchen90/article/details/85169218
記事のディレクトリ
マルチスレッドメモリ可視性
名前の解釈
可視性:変数の変更を共有スレッド価値は、他のスレッドがタイムリーに見ることができます。
共有変数:変数はメモリ内の作業コピー複数のスレッドに存在する場合、その変数は、この共有変数の数のスレッドです。
Javaのメモリモデル(モデルメモリーJavaが):アクセスルールのJavaプログラム変数(スレッド間で共有変数)、およびJVM内のメモリに格納された変数と基礎となる詳細は、メモリ変数から読み出しを説明しています。
並べ替え:アプリケーションのパフォーマンスの最適化を改善するために行うためにプロセッサやコンパイラを並べ替え命令の実際の実行の書き込みなど、異なるコード順。
- 並べ替え最適化コンパイラ(コンパイラの最適化)
- 並べ替え命令レベルの並列(プロセッサの最適化)
- 並べ替えメモリシステム(プロセッサの最適化)
シリアルIF-AS:コードの順序で実行するプログラムの実行結果ととにかく並べ替え、合意。
ルール
- メインメモリから直接読み取ることができない彼らのワーキングメモリである必要があります共有変数に対するすべての操作を通します。
- 他のスレッドが別のスレッド間で直接変数のワーキングメモリにアクセスすることができない、スレッド間を通過する価値がある変数は、メインメモリによって行われる必要があります。
その理由は表示されません
- クロススレッドの実行
- 結合クロススレッドが並べ替えを実行します
- 共有変数は最新ではありません
実装
Javaは、2つの音声レベルの可視性の実装をサポートsynchronized
してvolatile
。
1.同期
- スレッドが共有変数の値のロックを解除する前に、メインメモリに最新の更新でなければなりません
- スレッドロックは、ワーキングメモリの変数の共通の価値観、およびメインメモリ使用共有変数から最新の値を再読み込みする必要がクリアされます
要約:次のロックを解除するためにスレッドロックする前に、他のスレッドから見える共有変数を変更します。
2.揮発性
これは、メモリバリアを追加することによって達成し、最適化を並べ替え禁止されます。
- 以下のために
volatile
実行する書き込み変数は、書き込みの後に追加されるstore
バリア命令 - 以下のための
volatile
読み出し動作を実行する際の変数は、書き込みの後に追加されるload
バリア命令
概要:volatile
変数のスレッドが再読み込み、メインメモリから変数の値、および時に変数の変更を余儀なくされ、それがアクセスされるたびに、メインメモリに最新の値からリフレッシュするためにスレッドを強制します。
比較します
volatile
あなたはよりも、ロックする必要はありませんsynchronized
スレッドをブロックしないであろう、より軽量- メモリ開始の観点からの視認性、
volatile
ロックと同等のものを読んで、volatile
同等のロック解除を書きます synchronized
どちらの視認性を確保するために、だけでなく、原子性を保証しますが、volatile
唯一の視認性を確保するために、我々は原子性を保証することはできません
ソリューションのアトミック性を保証
- 使用する
synchronized
キーワードを - 使用
java.util.concurrent.locks.ReentrantLock
- 使用
java.util.concurrent.atomic.AtomicInteger