ホームページ  >  記事  >  Java  >  Javaにおけるvolatileの役割は何ですか

Javaにおけるvolatileの役割は何ですか

coldplay.xixi
coldplay.xixiオリジナル
2021-01-11 11:13:5428220ブラウズ

Java における volatile の役割: 1. Java は、可視性を確保するために volatile キーワードを提供します; 2. 順序性を確保するために、コードは [context =loadContext(); inited = true;]; 3. double を提供します。チェック。

Javaにおけるvolatileの役割は何ですか

このチュートリアルの動作環境: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。