我有一位朋友说,使用AtomicBoolean
进行启动/关闭同步无效:
public void startup() {
if (started.compareAndSet(false, true)) {
... startup code
}
}
他说{{1}}需要在循环内部进行线程安全。为什么我不能在循环之外使用AtomicBoolean
?这背后的理由是什么?
需要
答案 0 :(得分:0)
AtomicBoolean - 可以原子方式更新的布尔值。看到 用于描述的java.util.concurrent.atomic包规范 原子变量的属性。使用AtomicBoolean 应用程序如原子更新的标志,不能用作 替换布尔值。
绝不仅仅在循环中有效,当需要以原子方式更改它时,它是有效的,例如锁定。与循环无关
答案 1 :(得分:0)
您可能想要提供更多上下文。例如,如果您的启动代码初始化某些状态和未通过比较和交换的线程然后尝试使用该状态,那么您可能会有竞争。没有什么能够迫使其他线程等到初始化完成。