Java volatileはどんな作用があります
Java言語で作成されたプログラムにあります.プログラムの実行効率を向上させるために、コンパイラは自分から積極的に最適化し、よくアクセスされる変数をキャッシュし、プログラムはこの変数を読み出すときに直接キャッシュ(レジスタなど)からこの値を読み出す可能性があります.メモリに読み込まれません.このような利点の1つは、プログラムの実行効率を向上させることであるが、マルチスレッドプログラミングに遭遇すると.変数の値は、他のスレッドによって変更される可能性がありますが、キャッシュの値は変更されず、アプリケーションが読み込んだ値と実際の変数の値が一致しません.たとえば,今回のスレッドでは,1つの変数を読み出すとアクセス速度を向上させるために,まず1つのキャッシュに変数を読み出し,後で変数値をとると,そのままキャッシュから値をとる.変数値がこのスレッドで変更されると、同じタイミングで変数の新しい値がキャッシュにコピーされ、一貫性が保たれます.volatileはタイプ修飾子(typespecifier)です.これは、異なるスレッドによってアクセスおよび変更される変数を修飾するように設計されています.volatileタイプで定義された変数は、キャッシュを使用することなく、システムが使用するたびに対応するメモリから直接抽出されます.volatileを使用してメンバー変数を修飾すると、すべてのスレッドがいつ見ても変数の値が最新になります.例をあげる
volatileを入れないと死のループが発生します
注意しなければならないのは、volatileは動作の原子性を保証できないため、一般的にvolatileはsychronizedに取って代わることができない.さらにvolatileを使用すると、コンパイラによるコードの最適化が阻止されるため、プログラムの実行効率が低下します.だから、やむを得ない限り.そうでなければ.volatileを使わなくてもいいです.volatileはなるべく使用しないでください.複数のスレッドが操作してデータを共有する場合、メモリ内のデータが表示されることを保証します.下部原理:メモリフェンス.volatileキーワード修飾を使用する場合、データの操作はすべてプライマリ・ストレージで行われると理解できます.
synchronizedと比較すると、比較的軽量レベルの同期ポリシーです.
注意: volatileは「反発性」 を備えていない. volatileは変数の「原子性」 を保証できない
volatileを入れないと死のループが発生します
public class VolatileTest3 {
public static long c = 0;
//public volatile static long c = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while (c == 0) {
long x = c;
}
System.out.println("c=" + c);
}).start();
Thread.sleep(100);
c = 1;
}
}
注意しなければならないのは、volatileは動作の原子性を保証できないため、一般的にvolatileはsychronizedに取って代わることができない.さらにvolatileを使用すると、コンパイラによるコードの最適化が阻止されるため、プログラムの実行効率が低下します.だから、やむを得ない限り.そうでなければ.volatileを使わなくてもいいです.volatileはなるべく使用しないでください.複数のスレッドが操作してデータを共有する場合、メモリ内のデータが表示されることを保証します.下部原理:メモリフェンス.volatileキーワード修飾を使用する場合、データの操作はすべてプライマリ・ストレージで行われると理解できます.
private volatile boolean flag = false;
synchronizedと比較すると、比較的軽量レベルの同期ポリシーです.
注意: