Java 代码:
public class IncreaseTest {
public static int value = 0;
public synchronized int increment() {
return value++;
}
}
方法increment()
线程安全吗?是不是一定要加修饰符关键字 volatile
如下:</p>
public static volatile int value = 0;
Java 代码:
public class IncreaseTest {
public static int value = 0;
public synchronized int increment() {
return value++;
}
}
方法increment()
线程安全吗?是不是一定要加修饰符关键字 volatile
如下:</p>
public static volatile int value = 0;
此代码不是线程安全的。实例方法将在一个实例上同步,如果您有多个实例,它们将不会使用同一个监视器,因此更新可以交错。
您需要从value
字段中删除静态或将静态添加到increment()
方法中。
此外,正如您value
公开的那样,还有一个额外的问题是,可以在此方法之外更改或读取值,而无需使用同步,这可能导致读取旧值。
因此,将您的代码更改为以下代码将使其成为线程安全的:
public class IncreaseTest {
private int value = 0;
public synchronized int increment() {
return value++;
}
}
您可能应该使用atomicvars
如果您在两个线程中使用此方法,那么您确实需要 volatile 关键字。没有它,另一个线程可能无法获得最新的值。(C#)
我不认为这是线程安全的,因为静态变量是公共的,并且可以被其他线程以非线程安全的方式访问。为了线程安全,您必须按如下方式声明变量:
public static volatile int value;
现在value
是易失性的,将在同步块中访问。