对来自asyn线程的信号使用静态布尔与原子布尔的java差异
所以我有很多asyn线程同时运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这将表明其中一个子任务已失败。 我可以使用静态布尔变量而不是Java并发原子布尔变量,并且仍然可以实现相同的功能吗
你可以在下面搜索框中键入要查询的问题!
所以我有很多asyn线程同时运行。现在,当任何作业失败时,我将布尔作业失败标志设置为true。这将表明其中一个子任务已失败。 我可以使用静态布尔变量而不是Java并发原子布尔变量,并且仍然可以实现相同的功能吗
# 1 楼答案
对。你可以
# 2 楼答案
不!静态意味着与原子完全不同的东西
如果你定义这个
在类Foo中,那么staticFlag是属于该类而不是该类实例的变量
因此,如果执行
Foo.staticFlag = true
,所有类Foo的实例将受到该更改的影响另一方面
如果多个线程正在访问同一个布尔值,则存在争用条件 在那里,您可以使用原子布尔来防止同步问题
# 3 楼答案
据我所知,如果多个线程中的一个无法执行某些操作,您“只是”希望将全局状态设置为true。是的,您可以使用静态布尔值来实现这一点,但是您应该声明它为volatile
在我的世界里,你可以这样做,因为你的线程中没有一个会访问该布尔值进行比较等。如果他们访问它,他们会将其设置为true。他们不会在意布尔值是哪个。没有线程会将其设置为false
# 4 楼答案
主要区别是Thread-Safety,AtomicBoolean是线程安全的,而布尔变量不是线程安全的,不管它是否是静态的。静态变量是指它是类变量而不是实例变量。 见Oracle class variable
如果您从不同的线程访问(读/写)您的标志(您可能会这样做),请使用AtomicBoolean,否则使用标准boolean就足够了但是我建议使用
AtomicBoolean
,因为您处理的是少数写入标志的线程,而另一个线程可能会读取它第二个选项与其他答案一样,通过使用
volatile
关键字来确保线程安全garenty线程是否安全