Java における Volatile と Synchronized: メモリ バリアを理解する
Java では、変数を volatile として宣言し、synchronized ブロック内で変数にアクセスすることで、異なるレベルが提供されますスレッドセーフとメモリのVisibility.
Volatile Variables:
Volatile 変数はメモリの可視性を強制し、それらに加えられた変更が直ちにメイン メモリに反映されるようにします。これにより、他のスレッドが変数の古い値を認識するのを防ぎます。揮発性変数へのアクセスは非ブロッキングです。つまり、ロックを取得せず、他のスレッドを保留しません。
同期ブロック:
同期ブロック一方、メモリの可視性と実行制御の両方を提供します。スレッドが同期ブロックに入ると、そのブロックに関連付けられたオブジェクトのロックを取得します。これにより、他のスレッドが同じロックを取得してブロックを同時に実行することがなくなります。同期はメモリ バリアとしても機能し、ロックが解放される前に、ブロック内で行われたすべての変更が他のスレッドに確実に表示されるようにします。
読み取り-更新-書き込み
揮発性変数のコンテキストでは、「読み取り-更新-書き込み」は、スレッドが変数を読み取り、その読み取りに基づいて値を更新し、変数を書き込む一連の操作を意味します。新しい値を変数に戻します。このシーケンスは、Java メモリ モデルではアトミックではありません。
Volatile を使用する場合:
Volatile 変数は、次の場合に適しています。
同期を使用する場合:
同期は、次の場合に適しています。
入力に依存する変数の揮発性:
入力に依存する変数に volatile を使用すると、確実に他のスレッドは変数に加えられた変更を即座に認識します。ただし、揮発性変数は、その変数に対して実行される操作に対するスレッドの安全性を保証しないことに注意することが重要です。あなたのシナリオでは、同期ブロックを使用して入力と更新をアトミックに処理する方が良いかもしれません。
以上がJava での揮発性または同期: いつどちらを選択するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。