我希望有一个可以从不同线程读/写的标志,没有任何脏值问题.是否足以使其静态挥发?
static volatile boolean flag;
Run Code Online (Sandbox Code Playgroud)
不,如果您需要这样的动作,这还不够:
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.
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |