Java:有没有正确的方法来使用静态volatile变量?

Win*_*nte 4 java concurrency

我希望有一个可以从不同线程读/写的标志,没有任何脏值问题.是否足以使其静态挥发?

static volatile boolean flag;
Run Code Online (Sandbox Code Playgroud)

zen*_*ngr 5

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

volatile int v = 0;

Thread 1:
v++;

Thread 2:
v--;
Run Code Online (Sandbox Code Playgroud)

理想情况下,当您执行上面的代码时,您希望v = 0,但这是真正发生的事情(复合动作):

Thread 1:
r1 = v;
r2 = r1 + 1;
v = r2;

Thread 2:
r3 = v;
r4 = r3 - 1;
v = r4;
Run Code Online (Sandbox Code Playgroud)

并且两个线程将分别给出值1和-1.来源: 易挥发并不意味着原子!

如果在多线程场景中需要保证一致的结果,则应该使用Java中的Atomic类,如@ Eng.Fouad所指出的那样.

在布尔值的情况下,比较和设置将比AtomicBoolean类有用,而不是使用volatile.