繁体   English   中英

对来自异步线程的信号使用静态布尔值与AtomicBoolean的区别

[英]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-SafetyAtomicBoolean是Thread-Safe,而boolean变量不是Thread-Safe,无论它是不是static。 静态变量意味着它是一个Class变量,而不是实例变量。 请参阅Oracle类变量

回答你的问题

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

像其他答案一样,通过使用volatile关键字来确保线程安全的第二种选择

public static volatile myFlag = false;

将确保线程安全

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM