1.定義
Java
1つのキーワード/修飾子。
であることが保証volatile
共有変数に変更視界&秩序を、しかし、原子性を保証するものではありません
3.具体的な説明
以下は、私は詳細に説明しますvolatile
ことを保証するために、どのように「共有変数の可視性&秩序を、しかし保証アトミックない」特定の原則のは、
知識の予約:原子性、可視性、順序
3.1可視性を確保する
volatile
変更された属性の具体的な説明により、最新の値を読み取るたびに確実に読み取ることができます。しかし、読み込まれた値を更新することはできません。
- 原理
ワーキングメモリ内のスレッドAによって変更された共有属性値はすぐにメインメモリに更新され、スレッドB / C / Dがフェンスを読み書きするたびに、メインメモリから属性値を直接読み取るのと同じように達成されます。
- 揮発性に変更された変数がメインメモリで直接読み書きする一部のオンラインの読み取りと書き込みは同じですが、このステートメントは間違っており、同じような動作を示します
- 読み取り/書き込みフェンスはCPU命令です。読み取り/書き込みフェンスを挿入=は、このコマンドの前に実行し、次にこのコマンドの後に実行する必要があることをCPUとコンパイラに伝えます(順序付け)
- 読み取り/書き込みフェンスのもう1つの機能は、異なるCPUのキャッシュを強制的に更新することです。たとえば、書き込みフェンスは、このフェンスの前に書き込まれたデータをキャッシュにリフレッシュして、可視性を確保します
3.2注文を確認する
-
詳細な説明
揮発性の変更された属性に対して読み取り/書き込み操作を実行する場合は、前述のコードが実行されている必要があり、結果は後続の操作で確認できます -
原則
並べ替え時volatile
、属性を変更する読み取り/書き込み操作コードは分割線です。読み取り/書き込み操作前のコードは後ろに並べ替えることができず、同じものを前に並べることもできません。整然とした
3.3原子性の保証なし
- 詳細な説明
volatile
変更した属性値が変更前に読めば、変更、作業の値がメモリにコピーされている変更することはできません。つまり、同時実行を防ぐことはできません
- 原理
// 变量a 被volatile修饰
volatile static int a=0; a++; // 包含了2步操作:1 = 读取a、2= 执行a+1 & 将a+1结果赋值给a // 设:线程A、B同时执行以下语句,线程A执行完第1步后被挂起、线程B执行了a++,那么主存中a的值为1 // 但线程A的工作内存中还是0,由于线程A之前已读取了a的值 = 0,执行a++后再次将a的值刷新到主存 = 1 // 即 a++执行了2次,但2次都是从0变为1,故a的值最终为1
4.アプリケーションシナリオ
volatile
可視性と順序 が保証されているため、volatile
変更された共有属性は通常、同時読み取り/書き込みで問題がなく、軽量のsynchronized
実装と見なすことができます。
上のsynchronized
詳細を説明するために、記事を読んでください:Javaの:これは同期包括&詳細なキーワードの研究ガイドです
5.まとめ
- この記事では説明して、その役割にあるキーワード、「共有変数の可視性と秩序を確保するため、次のように、具体的に要約し、:
Java
volatile