3

次のコードがあります。

public class Simulation
{       
    public static volatile boolean  IS_EVEN_TICK;
}

そして別の(実行可能な)クラスの以下:

public void run()
{
    while (true)
    {
        // flip the "even/uneven tick" switch
        Simulation.IS_EVEN_TICK = !Simulation.IS_EVEN_TICK;
    }
}

Simulation.IS_EVEN_TICK への書き込みはその変数の現在の値に依存するため、私が理解している限り、これは一般にスレッドセーフではありません。ただし、このスレッドは変数に書き込む唯一のスレッドであり、他のすべてのスレッドは変数を読み取るだけです (変数にアクセスした場合)。

変数は、すべてのスレッドが正しい値を読み取るのに十分な揮発性がありますか?それにもかかわらず、変数へのアクセスを同期する必要がありますか?

4

2 に答える 2

0

仕様を読んでJMMを理解してください。変数volatileがヒープに直接作成され、プロセッサがその値をキャッシュにコピーしないことを意味する場合。

揮発性フィールドは、スレッド間で状態を通信するために使用される特別なフィールドです。volatile の各読み取りは、任意のスレッドによるその volatile への最後の書き込みを確認します。実際、それらは、キャッシングまたは並べ替えの結果として「古い」値が表示されることが決して許容されないフィールドとして、プログラマーによって指定されます。

于 2013-10-23T14:04:47.297 に答える