我想要一个可以从不同线程读取/写入的标志,而不会出现任何脏值问题。是否足以使其静态易变?
static volatile boolean flag;
不,如果您需要这样的操作,这还不够:
volatile int v = 0;
Thread 1:
v++;
Thread 2:
v--;
理想情况下,当您执行上述代码时,您希望 v=0,但这是真正发生的事情(复合动作):
Thread 1:
r1 = v;
r2 = r1 + 1;
v = r2;
Thread 2:
r3 = v;
r4 = r3 - 1;
v = r4;
两个线程将分别给出 1 和 -1 的值。资料来源: 易失性并不意味着原子性!
如果您需要在多线程场景中保证一致的结果,您应该使用 Java 中的 Atomic 类,正如@Eng.Fouad 指出的那样。
在布尔值的情况下,AtomicBoolean 类的比较和设置比使用 volatile 更有帮助。
这很诱人,但要避免使用这样的代码。
在一个简单的场景中,这似乎可行,因为boolean
不允许任何数学运算(您只能为其赋值)。但是你很少有简单的案例。最终,您将需要
if(flag) {
flag = false;
}
这段代码有时会中断。因此,正如其他答案所建议的,您应该使用java.util.concurrent.Atomic
* 类。