我的代码包含一些AtomicBoolean
字段。仅调用这些字段的get()
和set()
方法。
这些字段的类型可以安全地替换为原始布尔值吗?
我的意思是,原始布尔值的赋值和访问操作是 Java 中的原子操作。从这个角度来看,我看不出有任何理由AtomicBoolean
在我的情况下使用。
在我的理解中,只有使用结合比较和访问的AtomicBoolean
方法才有意义。compareAndSet
我错了吗?你能解释一下为什么吗?
我的代码包含一些AtomicBoolean
字段。仅调用这些字段的get()
和set()
方法。
这些字段的类型可以安全地替换为原始布尔值吗?
我的意思是,原始布尔值的赋值和访问操作是 Java 中的原子操作。从这个角度来看,我看不出有任何理由AtomicBoolean
在我的情况下使用。
在我的理解中,只有使用结合比较和访问的AtomicBoolean
方法才有意义。compareAndSet
我错了吗?你能解释一下为什么吗?
原子变量在Java Concurrency in Practice中被描述为“更好的 volatile”(参见第 15.3 节)。以下是这本书的摘录:
原子变量类提供变量的泛化
volatile
以支持原子条件读取-修改-写入操作。AtomicInteger
表示一个int
值,并提供get
与set
读取和写入 a 具有相同内存语义的方法volatile int
。
应用于您的案例,这意味着如果您仅使用get()
和set()
的方法AtomicBoolean
,则可以将它们安全地替换为对 的读写volatile boolean
。
volatile
需要保证所有线程都能看到变量的最新值。回到实践中的 Java 并发(第 3.1.4 节):
当一个字段被声明
volatile
时,编译器和运行时会注意到这个变量是共享的,并且对它的操作不应该与其他内存操作重新排序。Volatile
变量不会缓存在寄存器或缓存中,它们对其他处理器是隐藏的,因此对volatile
变量的读取始终返回任何线程最近的写入。
这些字段的类型可以安全地替换为原始布尔值吗?
简单原语boolean
与AtomicBoolean(在多线程环境中提供原子访问)不同。
但是,可以使用安全的替代替代方案,volatile boolean
它也可以提供原子访问,但我建议您保持AtomicBoolean
原样(因为它提供了额外的 API 方法,以防您将来可能会使用它)。
答案是不。你可以在这里找到原因为什么 AtomicBoolean 不能替代 Boolean?