对来自asyn线程的信号使用静态布尔与AtomicBoolean之间的区别

时间:2016-06-17 18:12:30

标签: java multithreading concurrency java.util.concurrent

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

4 个答案:

答案 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-SafetyAtomicBoolean是线程安全的,而布尔变量不是线程安全的,无论其是否为静态。 static variable表示它是一个Class变量而不是实例变量。 见Oracle class variable

  

回答你的问题

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

第二个选项,使用volatile关键字保护您的线程安全,就像其他答案一样

public static volatile myFlag = false;

将Garenty Thread-Safety