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

Java:有没有正确的方法来使用静态可变变量?,java,concurrency,Java,Concurrency,我希望有一个标志,可以从不同的线程读/写,而不存在任何脏值问题。它是否足以使其静态不稳定 static volatile boolean flag; 不,如果您需要这样的操作,这还不够: volatile int v = 0; Thread 1: v++; Thread 2: v--; 理想情况下,当执行上述代码时,您希望v=0,但实际情况是这样的(复合操作): 两个线程将分别给出值1和-1。资料来源: 如果您需要在多线程场景中保证一致的结果,那么您应该像@Eng.Fouad指出的那样在

我希望有一个标志,可以从不同的线程读/写,而不存在任何脏值问题。它是否足以使其静态不稳定

static volatile boolean flag;

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

volatile int v = 0;

Thread 1:
v++;

Thread 2:
v--;
理想情况下,当执行上述代码时,您希望v=0,但实际情况是这样的(复合操作):

两个线程将分别给出值1和-1。资料来源:

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


在布尔类的情况下,使用AtomicBoolean类进行比较和设置比使用volatile类更有用。

这很有诱惑力,但要避免这样的代码

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

if(flag) {
    flag = false;
}

这个密码有时会被破解。因此,正如其他答案所建议的,您应该使用
java.util.concurrent.Atomic
*类。

我不确定这是否足够,但我建议改为使用。我会尽可能避免使用静态可变字段。相反,我将使用一个AtomicBoolean,它被传递给要标记的线程。是的,它用于读取、计算和保存数据的操作。但是作为布尔变量仅用于读写操作正确吗?我不明白。您是否在询问r/w ops的使用是否正确?(我只是回答)不,我的意思是我们有静态易失性标志。然后我将它标记为false,另一条线程读取它,另一条线程将它标记为true。在这种情况下,我是否会得到脏值?啊,我明白了。好的,volatile可以工作,但是您需要确保您是所有者,并且它的修改限制为1个线程(例如,类似shutdownthissystem的标志可以是volatile)。但是,如果您有一个可以被任意线程随机修改并被其他线程再次读取的标志,那么您应该使用AtomicBoolean。
if(flag) {
    flag = false;
}