volatileとsynchronizeの違い
1930 ワード
volatileとsynchronizedの特徴
まず、スレッドセキュリティの2つの側面を理解する必要があります.実行制御とメモリ表示です.
実行制御の目的は、コード実行(順序)および同時実行可能かどうかを制御することである.
メモリ可視制御は、スレッド実行結果のメモリ内の他のスレッドの可視性を制御します.Javaメモリモデルの実装によれば,スレッドは具体的に実行する際に,まずホストデータをスレッドローカル(CPUキャッシュ)にコピーし,操作が完了してから結果をスレッドローカルからホストにブラシする.
Java 5には、
1
2
3
volatileとsynchronizedの違い volatileの本質は、jvmの現在の変数がレジスタ(ワークメモリ)内の値が不確定であることを伝え、ホストメモリから読み出す必要があることである.synchronizedは現在の変数をロックし、現在のスレッドのみがこの変数にアクセスでき、他のスレッドがブロックされます. volatileは変数レベルでのみ使用できます.synchronizedは、変数、メソッド、クラスレベルの を使用できます. volatileは変数の修正可視性しか実現できず、原子性を保証できない.synchronizedは変数の修正可視性と原子性 を保証することができる. volatileはスレッドのブロックをもたらさない.synchronizedはスレッドのブロックを引き起こす可能性があります. volatileタグの変数はコンパイラによって最適化されません.synchronizedタグの変数はコンパイラによって 最適化することができる
この2つのキーワードの役割をよりよく理解するには、Javaメモリモデルを参照することを強くお勧めします.
まず、スレッドセキュリティの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の違い
この2つのキーワードの役割をよりよく理解するには、Javaメモリモデルを参照することを強くお勧めします.