Java 对来自asyn线程的信号使用静态布尔和原子布尔的区别

Java 对来自asyn线程的信号使用静态布尔和原子布尔的区别,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,所以我有很多asyn线程同时运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这将表明其中一个子任务已失败。 我可以使用静态布尔变量而不是Java并发原子布尔变量,并且仍然可以实现相同的功能吗 我可以使用静态布尔变量代替Java并发原子变量吗 布尔值,仍然实现相同的功能 不!静态意味着与原子完全不同的东西 如果你定义这个 static boolean staticFlag; 在类Foo中,那么staticFlag是属于该类而不是该类实例的变量 因此,如果您执行Foo.stati

所以我有很多asyn线程同时运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这将表明其中一个子任务已失败。 我可以使用静态布尔变量而不是Java并发原子布尔变量,并且仍然可以实现相同的功能吗

我可以使用静态布尔变量代替Java并发原子变量吗 布尔值,仍然实现相同的功能

不!静态意味着与原子完全不同的东西

如果你定义这个

static boolean staticFlag;
在类Foo中,那么staticFlag是属于该类而不是该类实例的变量

因此,如果您执行
Foo.staticFlag=true
所有类Foo的实例都将受到该更改的影响

另一方面

如果多个线程正在访问同一个布尔值,则存在争用条件 在那里,您可以使用原子布尔来防止同步问题…

是的。你可以

volatile static AtomicBoolean flag

据我所知,如果多个线程中的一个无法执行某些操作,您“只是”希望将全局状态设置为true。是的,您可以使用静态布尔值来实现这一点,但是您应该声明它为volatile


在我的世界里,你可以这样做,因为你的线程中没有一个会访问该布尔值进行比较等。如果他们访问它,他们会将其设置为true。他们不会在意布尔值是哪个。没有线程会将其设置为false。

主要区别在于,是线程安全的,而布尔变量不是线程安全的,不管它是否是静态的。静态变量是指它是类变量而不是实例变量。 看

回答你的问题

如果您从不同的线程访问(读/写)您的标志(您可能会这样做),请使用AtomicBoolean,否则使用标准boolean就足够了但是我建议使用
原子布尔
,因为您处理的是少数写入标志的线程,而另一个线程可能会读取它

第二个选项与其他答案一样,使用
volatile
关键字来确保线程安全

public static volatile myFlag = false;

will garenty线程安全性

静态
意味着在所有实例中共享。它与线程安全性或原子性没有任何关系。但是另一个线程需要读取它,这样它就不会
false
,这就是你的问题所在。在这种情况下,您需要将其声明为volatile。如果将其设置为
volatile
,则该值是否被多次更改并不重要。然而,基本答案是正确的:他想要的是一个
静态可变布尔值。