2

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

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

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

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

4

3 回答 3

5

原子变量在Java Concurrency in Practice中被描述为“更好的 volatile”(参见第 15.3 节)。以下是这本书的摘录:

原子变量类提供变量的泛化volatile 以支持原子条件读取-修改-写入操作。 AtomicInteger表示一个int值,并提供getset 读取和写入 a 具有相同内存语义的方法 volatile int

应用于您的案例,这意味着如果您仅使用get()set()的方法AtomicBoolean,则可以将它们安全地替换为对 的读写volatile boolean

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

当一个字段被声明volatile时,编译器和运行时会注意到这个变量是共享的,并且对它的操作不应该与其他内存操作重新排序。Volatile变量不会缓存在寄存器或缓存中,它们对其他处理器是隐藏的,因此对volatile变量的读取始终返回任何线程最近的写入。

于 2017-04-12T21:58:56.193 回答
2

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

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

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

于 2017-04-12T21:32:52.350 回答
-1

答案是不。你可以在这里找到原因为什么 AtomicBoolean 不能替代 Boolean?

于 2017-04-12T21:28:06.363 回答