Java における volatile の役割: 1. Java は、可視性を確保するために volatile キーワードを提供します; 2. 順序性を確保するために、コードは [context =loadContext(); inited = true;]; 3. double を提供します。チェック。
このチュートリアルの動作環境: Windows7 システム、Java10 バージョン、DELL G3 コンピューターこの方法は、すべてのブランドのコンピューターに適しています。
関連する無料学習の推奨事項: Java の基本チュートリアル
Java における volatile の役割:
1. 可視性: Java は、可視性を確保するために volatile キーワードを提供します。
共有変数が volatile に変更されると、変更された値が直ちにメイン メモリに更新されます。他のスレッドがそれを読み取る必要がある場合は、メモリから新しい値を読み取ります。 . .
通常のシェア変数は変更された後、いつメイン メモリに書き込まれるかが不確実であるため、通常のシェア変数は可視性を保証できません。他のスレッドがそれを読み取るとき、メモリはまだ元の古い値である可能性があります。のため、視認性は保証されません。
さらに、synchronized と Lock によって可視性も保証できます。Synchronized と Lock を使用すると、1 つのスレッドだけが同時にロックを取得し、同期コードを実行することが保証され、変数の変更は次のようになります。ロックを解放する前にメインメモリにフラッシュされます。したがって、視認性は保証されます。
まずコードを見てみましょう。スレッド 1 が最初に実行され、スレッド 2 が後で実行される場合:
//线程1 boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true;
このコードは非常に典型的なコードです。多くの人が中断するときにこれを使用する可能性があります。スレッドのマーキング方法。しかし実際、このコードは完全に正しく実行されるでしょうか?つまり、スレッドは中断されますか?必ずしもそうとは限りませんが、ほとんどの場合、このコードはスレッドを中断する可能性がありますが、スレッドを中断できなくなる可能性もあります (この可能性は非常に低いですが、一度これが発生すると、無限ループが発生します)。
このコードによりスレッドが中断できなくなる理由を以下に説明します。前に説明したように、各スレッドは実行中に独自の作業メモリを持っているため、スレッド 1 の実行中に stop 変数の値をコピーし、それを独自の作業メモリに置きます。
次に、スレッド 2 が stop 変数の値を変更すると、それをメイン メモリに書き込む前に、スレッド 2 が他の処理に切り替わり、スレッド 1 は stop 変数の変更を知りません。スレッド 2 によって変数が変更されるため、サイクルは継続します。
しかし、volatile 変更を使用した後は、状況が異なります:
まず、volatile キーワードを使用すると、変更された値が直ちにメイン メモリに書き込まれます;
第 2 章: volatile キーワードが使用されている場合、スレッド 2 が変更を行うと、スレッド 1 の作業メモリ内のキャッシュ変数 stop のキャッシュ ラインが無効になります (ハードウェア層に反映される場合は、CPU の L1 またはL2 キャッシュは無効になります) );
3 番目: スレッド 1 の作業メモリ内のキャッシュ変数 stop のキャッシュ ラインが無効であるため、スレッド 1 はメイン メモリに移動して変数の値を読み取ります。また止まります。
次に、スレッド 2 が停止値を変更すると (もちろん、これには、スレッド 2 の作業メモリ内の値を変更し、変更された値をメモリに書き込むという 2 つの操作が含まれます)、作業スレッド 1 のメモリからキャッシュ変数 stop のキャッシュ ラインが無効であり、スレッド 1 がそれを読み取ると、そのキャッシュ ラインが無効であることがわかり、キャッシュ ラインに対応するメイン メモリのアドレスが更新されるのを待ちます。次に、対応するメイン メモリに移動して最新の値を読み取ります。
したがって、スレッド 1 が読み取るのは最新の正しい値です。
2. 順序性を確保する
volatile boolean inited = false; //线程1: context = loadContext(); inited = true; //线程2: while(!inited ){ sleep() } doSomethingwithconfig(context);
コンテキストが初期化されていることを確認します。
3、再確認してください
class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance==null) { synchronized (Singleton.class) { if(instance==null) instance = new Singleton(); } } return instance; } }
以上がJavaにおけるvolatileの役割は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。