0

複数のスレッドが、以前に設定され、その後変更されないプリミティブ型を読み取った場合、間違った値を取得できますか?

たとえば、次の単純なコードの抜粋があるとします。

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 として設定されている場合、後でそれにアクセスするには常にスレッドセーフである必要がありますね。

4

4 に答える 4

1

immutable(static and final)であると言っているので、スレッドセーフであると安全に言えます。

于 2012-07-18T13:17:08.057 に答える
1

proceedisstaticとであるためfinal、スレッドセーフになる再割り当てはできません。

staticそれはクラスレベルであり、finalその値は変更できないと言い、これはprimitive非常に反抗的に不変であり、したがってスレッドセーフです。

于 2012-07-18T13:16:18.187 に答える
1

変数が であるという事実はfinal、すべてのスレッドが一貫した初期化後の状態でそれを見ることを保証します。これはオブジェクトの参照にも適用できます (つまり、オブジェクトが null 以外の参照に初期化されている場合、すべてのスレッドはそのオブジェクトの null 以外の値を認識します。ただし、オブジェクトがスレッドセーフでない場合、一部のスレッドはオブジェクト自体を不整合または古い状態)。

ps: これは、読み取りメソッドがブール値を読み取ろうとしないことを前提としています。その場合、デフォルト (false) 値が表示されます。

于 2012-07-18T13:16:39.170 に答える
1

参照は不変であるため、スレッドセーフです。

変更可能な場合は、volatileキーワードを使用して、別のスレッドで変更された場合に最新の値を取得する必要があります。

Java で volatile キーワードを使用したことがありますか?

于 2012-07-18T13:17:54.373 に答える