gpt4 book ai didi

java - 为什么 AtomicBoolean 不能替代 Boolean?

转载 作者:IT老高 更新时间:2023-10-28 20:59:20 25 4
gpt4 key购买 nike

AtomicBoolean 的 Oracle JDK Javadoc 声明:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html

A boolean value that may be updated atomically. See the java.util.concurrent.atomic package specification for description of the properties of atomic variables. An AtomicBoolean is used in applications such as atomically updated flags, and cannot be used as a replacement for a Boolean.

我和一位同事试图找出 AtomicBoolean 不能替代的用例,我们唯一能想到的是 Boolean 对象具有 AtomicBoolean 没有的方法。

这是唯一的原因,还是在写这篇文章时有其他想法?

最佳答案

Boolean 是一个不可变的值对象。它被设计为不变并最终确定以强制执行。 java.lang.Boolean 从 1.0 开始就存在了。

AtomicBoolean 是可变的,旨在进行更新,以便更新后的值在线程间可见。 AtomicBoolean 是在 Java 5 中引入的。

这些是完全不同的概念,这就是为什么 AtomicBoolean 不是为了扩展 Boolean 而设计的。如果不破坏使用它的代码的预期不变量,就不能用可变对象替换不可变对象(immutable对象)。如果可以将原子版本传入其位置,则期望接收不可变值的代码可能会被破坏。

所以这是一个用例:如果 AtomicBoolean 被引入作为可替代 Boolean 的东西,您可能会遇到这样一种情况,即在此更改之前创建的类可以合理地期望在某些返回 Boolean 的方法中它不需要由于 boolean 值是不可变的,因此通过防御性副本。如果返回的引用恰好是从更改为使用 AtomicBoolean 而不是 Boolean 的源初始化的,那么现在可以通过调用返回 Boolean 的方法来修改该字段,方法是将其转换为 AtomicBoolean。

原子类设计用于处理并发更新(作为对 volatile 的改进),但设计并发代码的最有效方法是使用不可变值。所以请注意不要将 AtomicBoolean 误认为是“编写多线程代码时使用的 boolean 值”。

关于java - 为什么 AtomicBoolean 不能替代 Boolean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com