8

Java コード:

public class IncreaseTest {
    public static int value = 0;

    public synchronized int increment() {
        return value++;
    }
}

メソッドはincrement()スレッドセーフですか? 次のように修飾語キーワードを追加する必要がありますか volatile:</p>

  public static volatile int value = 0;
4

4 に答える 4

24

このコードはスレッドセーフではありません。インスタンス メソッドはインスタンスで同期します。複数のインスタンスがある場合、それらは同じモニターを使用しないため、更新がインターリーブされる可能性があります。

フィールドから static を削除するかvalue、メソッドに static を追加する必要がありincrement()ます。

また、value公開したように、同期を使用せずにこのメソッドの外部で値を変更または読み取ることができ、古い値を読み取る可能性があるという追加の問題があります。

したがって、コードを次のように変更すると、スレッドセーフになります。

public class IncreaseTest {
    private int value = 0;

    public synchronized int increment() {
        return value++;
    }
}
于 2013-03-02T12:58:38.887 に答える
0

静的変数はパブリックであり、スレッドセーフではない方法で他のスレッドからアクセスできるため、これはスレッドセーフではないと思います。スレッド セーフにするには、次のように変数を宣言する必要があります。

public static volatile int value;

現在value揮発性であり、同期ブロックでアクセスされます。

于 2013-03-02T13:00:28.763 に答える
0

このメソッドを 2 つのスレッドで使用している場合は、volatile キーワードが必要です。これがないと、別のスレッドが最新の値を取得できない可能性があります。(C#)

于 2013-03-02T12:48:39.897 に答える