所以我有很多asyn线程并发运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这表明其中一个子任务失败了。 我可以使用静态布尔变量而不是Java并发原子布尔值,仍然可以实现相同的功能吗?
答案 0 :(得分:2)
我可以使用静态布尔变量而不是Java并发原子 布尔并仍然实现相同的功能?
没有!静态意味着与Atomic完全不同的东西
如果你定义这个
static boolean staticFlag;
在类Foo中,那么 staticFlag 是属于类的变量而不是类的实例...
因此,如果您执行Foo.staticFlag = true
,所有,则类Foo的实例将受到该更改的影响..
另一方面..
如果多个线程正在访问相同的布尔值,那么您就有竞争条件 在那里你可以使用 AtomicBoolean 来防止同步问题......
答案 1 :(得分:1)
据我了解,你只是"只是"想要将全局状态设置为true,如果许多线程中的一个错误地执行某些操作。是的,您可以使用静态布尔值来执行此操作,但您应该将其声明为volatile。
在我的世界中你可以这样做,因为你的线程中的非线程将访问该布尔值以进行比较等。如果他们访问它,他们将把它设置为true。它们不关心布尔值具有哪个值。没有线程会将其设置为false。
答案 2 :(得分:0)
是。你可以
volatile static AtomicBoolean flag
答案 3 :(得分:0)
主要区别是Thread-Safety,AtomicBoolean是线程安全的,而布尔变量不是线程安全的,无论其是否为静态。 static variable表示它是一个Class变量而不是实例变量。 见Oracle class variable
回答你的问题
如果您从不同的线程(您可能会这样做)访问(读/写)您的标志,请使用AtomicBoolean,否则使用标准布尔就足够了。 但是我建议使用AtomicBoolean
,因为你正在处理几个写入该标志的线程,而另一个线程可能会读取它。
第二个选项,使用volatile
关键字保护您的线程安全,就像其他答案一样
public static volatile myFlag = false;
将Garenty Thread-Safety