首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么AtomicBoolean不能代替布尔值呢?

为什么AtomicBoolean不能代替布尔值呢?
EN

Stack Overflow用户
提问于 2016-04-29 14:55:25
回答 6查看 10.2K关注 0票数 36

用于AtomicBoolean的Oracle声明:

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

可以原子地更新的布尔值。有关原子变量属性的描述,请参阅java.util.concurrent.atomic包规范。AtomicBoolean在诸如原子更新标志之类的应用程序中使用,不能用作布尔值的替代。

我和一位同事试图找出一个用例,在这个用例中,AtomicBoolean不能替代,我们唯一能想到的就是布尔对象有一些AtomicBoolean没有的方法。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-04-29 14:59:23

Boolean是原语boolean的包装类。它可以由编译器(装箱转换)从boolean自动创建,也可以转换为布尔(取消装箱转换)。对于AtomicBoolean来说,情况并非如此,因为它是为并发目的而设计的单独类。

因此,这两个类在语言级别上具有不同的语义:

代码语言:javascript
复制
Boolean b = new Boolean(true);
AtomicBoolean ab = new AtomicBoolean(true);
System.out.println(true == b);  // automatic unboxing of Boolean variable
System.out.println(true == ab);  // compiler error
票数 37
EN

Stack Overflow用户

发布于 2016-04-29 15:11:25

布尔值是不可变的值对象。它的设计是不变的,并成为最终的,以强制执行。java.lang.Boolean从1.0开始就已经出现了。

AtomicBoolean是可变的,其设计是为了更新,以便更新后的值在线程之间可见。AtomicBoolean是在Java5中引入的。

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

这里有一个用例:如果AtomicBoolean是作为布尔值的替代物引入的,那么在这个更改之前创建的类可以合理地预期,在某些返回布尔值的方法中,它不需要传递防御副本,因为布尔是不可变的。如果返回的引用碰巧是从更改为使用AtomicBoolean而不是布尔值的源中初始化的,那么该字段现在可以通过调用返回布尔值的方法进行修改,方法是将其转换为AtomicBoolean。

原子类是为处理并发更新而设计的(作为对volatile的改进),但是设计并发代码最有效的方法是使用不变的值。因此,不要将AtomicBoolean误认为是“编写多线程代码时使用的布尔值”。

票数 57
EN

Stack Overflow用户

发布于 2016-04-29 14:59:44

它们不能自动装箱,所以不能在条件词中使用,例如,

代码语言:javascript
复制
// Explodey
if (someAtomicBoolean) {
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36941526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档