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

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

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

此外,正如您value公开的那样,还有一个额外的问题是,可以在此方法之外更改或读取值,而无需使用同步,这可能导致读取旧值。

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

public class IncreaseTest {
    private int value = 0;

    public synchronized int increment() {
        return value++;
    }
}
于 2013-03-02T12:58:38.887 回答
1

您可能应该使用atomicvars

于 2014-06-10T07:41:19.407 回答
0

如果您在两个线程中使用此方法,那么您确实需要 volatile 关键字。没有它,另一个线程可能无法获得最新的值。(C#)

于 2013-03-02T12:48:39.897 回答
0

我不认为这是线程安全的,因为静态变量是公共的,并且可以被其他线程以非线程安全的方式访问。为了线程安全,您必须按如下方式声明变量:

public static volatile int value;

现在value是易失性的,将在同步块中访问。

于 2013-03-02T13:00:28.763 回答