volatileとsynchronizeの違い

1930 ワード

volatileとsynchronizedの特徴
まず、スレッドセキュリティの2つの側面を理解する必要があります.実行制御とメモリ表示です.
実行制御の目的は、コード実行(順序)および同時実行可能かどうかを制御することである.
メモリ可視制御は、スレッド実行結果のメモリ内の他のスレッドの可視性を制御します.Javaメモリモデルの実装によれば,スレッドは具体的に実行する際に,まずホストデータをスレッドローカル(CPUキャッシュ)にコピーし,操作が完了してから結果をスレッドローカルからホストにブラシする.synchronizedキーワードは、実行制御の問題を解決し、他のスレッドが現在のオブジェクトの監視ロックを取得することを阻止し、現在のオブジェクトのsynchronizedキーワードで保護されたコードブロックが他のスレッドにアクセスできず、同時実行できないようにする.さらに重要なことに、synchronizedは、すべてのCPUの操作結果がホストメモリに直接ブラシされることを保証するメモリバリアを作成し、操作のメモリ可視性を保証するとともに、このロックを先に取得したスレッドのすべての操作をhappens-beforeがその後、このロックのスレッドの操作を取得することを保証する.volatileキーワードはメモリの可視性の問題を解決し、volatile変数の読み書きがすべてプライマリ・メモリに直接ブラシされ、変数の可視性が保証されます.これにより、変数の可視性が要求され、読み取り順序が要求されない要件を満たすことができる.volatileのキーワードを使用すると、boolen、short、int、longなどの元の変数に対する操作の原子性のみが実現されるが、volatileは複合操作の原子性を保証することができず、i++であっても実際には複数の原子操作からなる:read i; inc; write iであり、複数のスレッドが同時にi++を実行すると、volatileは、動作するiが同じメモリであることを保証するしかありませんが、汚れたデータが書き込まれる可能性があります.
Java 5には、atomic wrapper classesの原子データ型が提供され、increaseのような動作はすべて原子操作であり、sychronizedキーワードを使用する必要はない.volatileキーワードについては、以下のすべての条件が満たされている場合にのみ使用できます.
1.                  ,                  。
2.                    。

1
2
3
volatileとsynchronizedの違い
  • volatileの本質は、jvmの現在の変数がレジスタ(ワークメモリ)内の値が不確定であることを伝え、ホストメモリから読み出す必要があることである.synchronizedは現在の変数をロックし、現在のスレッドのみがこの変数にアクセスでき、他のスレッドがブロックされます.
  • volatileは変数レベルでのみ使用できます.synchronizedは、変数、メソッド、クラスレベルの
  • を使用できます.
  • volatileは変数の修正可視性しか実現できず、原子性を保証できない.synchronizedは変数の修正可視性と原子性
  • を保証することができる.
  • volatileはスレッドのブロックをもたらさない.synchronizedはスレッドのブロックを引き起こす可能性があります.
  • volatileタグの変数はコンパイラによって最適化されません.synchronizedタグの変数はコンパイラによって
  • 最適化することができる
    この2つのキーワードの役割をよりよく理解するには、Javaメモリモデルを参照することを強くお勧めします.