マルチスレッドメモリ可視性

著作権:LeifChenの元、ソースを明記してください、ありがとう〜https://blog.csdn.net/leifchen90/article/details/85169218

マルチスレッドメモリ可視性

名前の解釈

可視性:変数の変更を共有スレッド価値は、他のスレッドがタイムリーに見ることができます。
共有変数:変数はメモリ内の作業コピー複数のスレッドに存在する場合、その変数は、この共有変数の数のスレッドです。
Javaのメモリモデル(モデルメモリーJavaが):アクセスルールのJavaプログラム変数(スレッド間で共有変数)、およびJVM内のメモリに格納された変数と基礎となる詳細は、メモリ変数から読み出しを説明しています。

Javaのメモリモデル
並べ替え:アプリケーションのパフォーマンスの最適化を改善するために行うためにプロセッサやコンパイラを並べ替え命令の実際の実行の書き込みなど、異なるコード順。

  1. 並べ替え最適化コンパイラ(コンパイラの最適化)
  2. 並べ替え命令レベルの並列(プロセッサの最適化)
  3. 並べ替えメモリシステム(プロセッサの最適化)

シリアルIF-AS:コードの順序で実行するプログラムの実行結果ととにかく並べ替え、合意。

ルール

  • メインメモリから直接読み取ることができない彼らのワーキングメモリである必要があります共有変数に対するすべての操作を通します。
  • 他のスレッドが別のスレッド間で直接変数のワーキングメモリにアクセスすることができない、スレッド間を通過する価値がある変数は、メインメモリによって行われる必要があります。

共有変数の可視性原理

その理由は表示されません

  1. クロススレッドの実行
  2. 結合クロススレッドが並べ替えを実行します
  3. 共有変数は最新ではありません

実装

Javaは、2つの音声レベルの可視性の実装をサポートsynchronizedしてvolatile

1.同期

  • スレッドが共有変数の値のロックを解除する前に、メインメモリに最新の更新でなければなりません
  • スレッドロックは、ワーキングメモリの変数の共通の価値観、およびメインメモリ使用共有変数から最新の値を再読み込みする必要がクリアされます

要約:次のロックを解除するためにスレッドロックする前に、他のスレッドから見える共有変数を変更します。

2.揮発性

これは、メモリバリアを追加することによって達成し、最適化を並べ替え禁止されます。

  • 以下のためにvolatile実行する書き込み変数は、書き込みの後に追加されるstoreバリア命令
  • 以下のためのvolatile読み出し動作を実行する際の変数は、書き込みの後に追加されるloadバリア命令

概要:volatile変数のスレッドが再読み込み、メインメモリから変数の値、および時に変数の変更を余儀なくされ、それがアクセスされるたびに、メインメモリに最新の値からリフレッシュするためにスレッドを強制します。

比較します

  • volatileあなたはよりも、ロックする必要はありませんsynchronizedスレッドをブロックしないであろう、より軽量
  • メモリ開始の観点からの視認性、volatileロックと同等のものを読んで、volatile同等のロック解除を書きます
  • synchronizedどちらの視認性を確保するために、だけでなく、原子性を保証しますが、volatile唯一の視認性を確保するために、我々は原子性を保証することはできません

ソリューションのアトミック性を保証

  1. 使用するsynchronizedキーワードを
  2. 使用 java.util.concurrent.locks.ReentrantLock
  3. 使用 java.util.concurrent.atomic.AtomicInteger

参照

  1. Javaのメモリ可視性をマルチスレッド手の込んだ

おすすめ

転載: blog.csdn.net/leifchen90/article/details/85169218