0

なぜプリミティブに volatile が必要なのですか? 私が見つけた最も一般的な例は次のとおりです。

volatile boolean shutdownRequested;

...

public void shutdown() { shutdownRequested = true; }

public void doWork() { 
    while (!shutdownRequested) { 
        // do stuff
    }
}

しかし、私が自分でそれを実行しようとしていたとき。volatile 宣言は何も変更しませんでした。volatile と not volatile の両方で停止しますshutdownRequested

4

5 に答える 5

4

基本的に、volatile は、変数の値が異なるスレッドによって変更されることを示すために使用されます。

揮発性 Java 変数とは、次のことを意味します。

この変数の値がスレッドローカルにキャッシュされることはありません。すべての読み取りと書き込みは「メイン メモリ」に直接行われます。変数へのアクセスは、同期ブロックに囲まれているかのように機能し、それ自体で同期されます。

于 2013-04-03T11:55:39.937 に答える
2

マークされていない変数はvolatile、JVM が望むだけキャッシュできます。たとえば、変数のコピーがレジスタにロードされる可能性があり、特にタイトなループでは、元のインスタンス変数を参照できない場合があります。

としてマークすると、常に元のインスタンス変数を参照するvolatile必要があることが JVM に通知されます。

表示されているのは、許可されているにもかかわらず、おそらく JVM が変数をキャッシュしていないことです。

これは、マルチスレッド コードが正しいことを証明するのが難しい理由の 1 つです。すべての JVM が同じように動作するわけではないだけでなく、コードをデバッグするときと実行時とで異なる結果が得られることさえあり、マルチコア ユニットで実行されている場合は、再び異なる結果が得られる可能性があります。

于 2013-04-03T11:58:30.777 に答える
0

volatileマルチスレッドコードに役立ちます。

この質問を参照してください: Do you ever use the volatile キーワード in Java?

于 2013-04-03T11:57:15.167 に答える