4

我想要一个可以从不同线程读取/写入的标志,而不会出现任何脏值问题。是否足以使其静态易变?

static volatile boolean flag;
4

2 回答 2

5

不,如果您需要这样的操作,这还不够:

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 更有帮助。

于 2012-11-14T08:24:38.597 回答
3

这很诱人,但要避免使用这样的代码。

在一个简单的场景中,这似乎可行,因为boolean不允许任何数学运算(您只能为其赋值)。但是你很少有简单的案例。最终,您将需要

if(flag) {
    flag = false;
}

这段代码有时会中断。因此,正如其他答案所建议的,您应该使用java.util.concurrent.Atomic* 类。

于 2012-11-14T08:42:25.067 回答