[英]Difference between using static boolean vs AtomicBoolean for signals from asyn threads
所以我有很多异步运行的异步线程。 现在,当任何作业失败时,我将布尔作业失败标志设置为true。 那将表明子任务之一已失败。 我可以使用静态布尔值变量代替Java并发原子布尔值并仍然实现相同的功能吗?
我可以使用静态布尔值变量代替Java并发原子布尔值并仍然实现相同的功能吗?
没有! 静态意味着与原子完全不同的东西
如果你定义这个
static boolean staticFlag;
在Foo类中,则staticFlag是属于该类的变量,而不是该类的实例...
因此,如果执行Foo.staticFlag = true
,则该更改将影响类Foo的所有实例。
另一方面..
如果多个线程正在访问同一个布尔值,那么您有一个竞争条件蚂蚁,您可以使用AtomicBoolean来防止同步问题...
据我了解,如果许多线程之一无法执行某项操作,您“只是”希望将全局状态设置为true。 是的,您可以使用静态布尔值来做到这一点,但是您应该将其声明为volatile。
在我的世界中,您可以执行此操作,因为没有线程会访问该布尔值以进行比较等。如果他们访问它,则将其设置为true。 他们不在乎布尔值是哪个。 没有线程将其设置为false。
是。 你可以有
volatile static AtomicBoolean flag
主要区别是Thread-Safety , AtomicBoolean是Thread-Safe,而boolean变量不是Thread-Safe,无论它是不是static。 静态变量意味着它是一个Class变量,而不是实例变量。 请参阅Oracle类变量
回答你的问题
如果要从其他线程访问(读/写)标志(您可能这样做),请使用AtomicBoolean,否则使用标准布尔值就足够了。 但是我建议使用AtomicBoolean
,因为您要处理的线程很少写入该标志,而另一个线程可能会读取它。
像其他答案一样,通过使用volatile
关键字来确保线程安全的第二种选择
public static volatile myFlag = false;
将确保线程安全
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.