以下增量代码线程在java中是否安全?

cod*_*see 7 java thread-safety

Java代码:

public class IncreaseTest {
    public static int value = 0;

    public synchronized int increment() {
        return value++;
    }
}
Run Code Online (Sandbox Code Playgroud)

方法increment()线程安全吗?我是否必须添加modifier关键字 volatile,如下所示:

  public static volatile int value = 0;
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 22

此代码不是线程安全的.实例方法将在实例上同步,如果您有多个实例,则它们将不使用相同的监视器,因此更新可以交错.

您需要从value字段中删除静态或向increment()方法添加静态.

此外,正如您value公开的那样,还有一个问题是,如果不使用可能导致读取旧值的同步,则可以在此方法之外更改或读取值.

因此,将代码更改为以下内容将使其成为线程安全的:

public class IncreaseTest {
    private int value = 0;

    public synchronized int increment() {
        return value++;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @codeisee:请注意,您可以简单地使用`AtomicInteger`及其`incrementAndGet()`方法,该方法完全符合您的代码,为您处理线程安全,并且效率更高. (2认同)
  • @JBNizet`getAndIncrement()`表示与问题中的代码相同的行为. (2认同)
  • 私有易失性整型值= 0;// @Mark Rotteveel,是否需要添加修饰符关键字 volatile? (2认同)
  • @MarkRotteveel:是的,你是对的:-)我总是要三思而后行,最后用两条不同的指令编写代码,使意图更清晰:`int tmp = value; 值++; return tmp;`.听起来很愚蠢,但至少你不能误解代码的作用. (2认同)