仅使用 get() 和 set() 方法时,将 AtomicBoolean 替换为原始类型?

Replace AtomicBoolean by primitive type when only the get() and set() methods are used?

我的代码包含一些 AtomicBoolean 字段。仅调用这些字段的 get()set() 方法。

这些字段的类型可以安全地替换为原始布尔值吗?

我的意思是,原始布尔值的赋值和访问操作在 Java 中是原子操作。从这个角度来看,我看不出有任何理由在我的案例中使用 AtomicBoolean

在我的理解中,AtomicBoolean 只有在使用像 compareAndSet 这样的方法时才有意义,它结合了比较和访问。我错了吗?你能解释一下为什么吗?

答案是否定的。你可以在这里找到原因

Can the types of these fields safely be replaced by primitive boolean?

简单原语 booleanAtomicBoolean(在多线程环境中提供原子访问)不同。

但是,安全的替代方案可能是使用 volatile boolean,它也可以提供原子访问,但我建议您保持 AtomicBoolean 不变(因为它提供额外的 API方法,以防你将来可能会这样做)。

原子变量在 Java 并发实践 中被描述为 "better volatiles"(请参阅第 15.3 节)。这是本书的摘录:

The atomic variable classes provide a generalization of volatile variables to support atomic conditional read-modify-write operations. AtomicInteger represents an int value, and provides get and set methods with the same memory semantics as reads and writes to a volatile int.

适用于您的情况,这意味着如果您仅使用 AtomicBooleanget()set() 方法,可以安全地将它们替换为 [=19] 的读写=].

需要

volatile 来保证所有线程都能看到变量的 最新 值。返回 Java 并发实践(第 3.1.4 节):

When a field is declared volatile, the compiler and runtime are put on notice that this variable is shared and that operations on it should not be reordered with other memory operations. Volatile variables are not cached in registers or in caches where they are hidden from other processors, so a read of a volatile variable always returns the most recent write by any thread.