複数のスレッドが、以前に設定され、その後変更されないプリミティブ型を読み取った場合、間違った値を取得できますか?
たとえば、次の単純なコードの抜粋があるとします。
public static final boolean proceed = read(); // Read the value from a file
public static void doSomething() // Method accessed by multiple threads
{
if (proceed)
{
System.out.println("TRUE");
}
else
{
System.out.println("FALSE");
}
}
proceed
変数が に初期化されていると仮定すると、メソッドtrue
を同時に実行する複数のスレッドの 1 つ以上で、出力されるメッセージが である可能性はありますか?doSomething()
FALSE
変数が可変である場合proceed
、確かにそれは可能であるため、同期またはを使用する必要がありますAtomicBoolean
(たとえば、この質問のように)。ただし、この場合proceed
は不変であり、含まれているクラスの静的初期化中に一度だけ設定されます。
他のプリミティブ型についても同様に、値が final として設定されている場合、後でそれにアクセスするには常にスレッドセーフである必要がありますね。