3

我有以下代码:

public class Simulation
{       
    public static volatile boolean  IS_EVEN_TICK;
}

以及另一个(可运行)类中的以下内容:

public void run()
{
    while (true)
    {
        // flip the "even/uneven tick" switch
        Simulation.IS_EVEN_TICK = !Simulation.IS_EVEN_TICK;
    }
}

据我了解,这通常不是线程安全的,因为对 Simulation.IS_EVEN_TICK 的写入取决于该变量的当前值。然而,这个线程是唯一写入变量的线程,所有其他线程只会读取变量(如果他们访问它的话)。

变量是否足够不稳定以确保所有线程都从中读取正确的值,还是我需要同步对变量的访问?

4

2 回答 2

5

然而,这个线程是唯一一个曾经写入变量的线程......变量是否足够不稳定以确保所有线程都从中读取正确的值。

如果只有一位作家,则没有竞争条件。您不需要变量同步。

您可能会考虑使用 anAtomicBoolean但它不支持toggle()方法,因此如果您有多个编写器切换值,则必须执行以下操作:

private final AtomicBoolean isEvenTick = new AtomicBoolean();
...
boolean currentValue;
do {
  currentValue = isEvenTick.get();
} while (!isEvenTick.compareAndSet(currentValue, !currentValue);
于 2013-10-23T13:58:39.030 回答
0

尝试阅读规范并理解 JMM,如果您的变量volatile意味着该变量将直接在堆中创建,并且没有一个处理器不会将该值复制到自己的缓存中。

可变字段是用于在线程之间传递状态的特殊字段。对 volatile 的每次读取都会看到任何线程对该 volatile 的最后一次写入;实际上,它们被程序员指定为由于缓存或重新排序而不能看到“陈旧”值的字段

于 2013-10-23T14:04:47.297 回答