我有朋友说,如下使用AtomicBoolean
for同步启动/关闭是无效的:
public void startup() {
if (started.compareAndSet(false, true)) {
... startup code
}
}
他说AtomicBoolean
需要在循环内部才能实现线程安全。为什么我不能AtomicBoolean
在循环外使用?这背后的原因是什么?
需要一个
AtomicBoolean - 可以自动更新的布尔值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicBoolean 用于诸如原子更新标志之类的应用程序中,不能用作 Boolean 的替代品。
决不是它只在循环中有效,当您需要以原子方式更改它时它是有效的,例如锁。与循环无关
您可能想提供更多上下文。例如,如果您的启动代码初始化了一些无法进行比较和交换的状态和线程,然后尝试使用该状态,那么您可能会遇到竞争。没有什么会迫使其他线程等待初始化完成。