是一个易失性的布尔开关只由一个线程写入线程安全吗?

Leg*_*ort 3 java multithreading synchronization volatile

我有以下代码:

public class Simulation
{       
    public static volatile boolean  IS_EVEN_TICK;
}
Run Code Online (Sandbox Code Playgroud)

以及另一个(runnable)类中的以下内容:

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

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

变量是否足够易变,以确保所有线程从中读取正确的值,或者我是否需要同步对变量的访问?

Gra*_*ray 6

但是这个线程是唯一写入变量的线程......变量是否足够易变,以确保所有线程都从中读取正确的值.

如果只有一个作家,则没有竞争条件.你不是需要在可变同步.

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

private final AtomicBoolean isEvenTick = new AtomicBoolean();
...
boolean currentValue;
do {
  currentValue = isEvenTick.get();
} while (!isEvenTick.compareAndSet(currentValue, !currentValue);
Run Code Online (Sandbox Code Playgroud)

  • 读者可以访问boolean _before_作者更新它或_after_.总是那场比赛@JeanCarlosSuárezMarranzini.你无法摆脱它,即使你同步它. (2认同)