为什么AtomicBoolean不能代替Boolean? [英] Why can't AtomicBoolean be a replacement for Boolean?

查看:1786
本文介绍了为什么AtomicBoolean不能代替Boolean?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

用于AtomicBoolean状态的Oracle JDK Javadoc:

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

一个布尔值,可以自动更新.见 java.util.concurrent.atomic软件包规范,用于描述 原子变量的属性. AtomicBoolean用于 原子更新标志之类的应用程序,不能用作 替换为布尔值.

我和一位同事试图找出一个用例,其中AtomicBoolean不能替代,并且我们唯一能想到的是,布尔对象具有某些方法,而AtomicBoolean没有. >

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

解决方案

Boolean是原始boolean周围的包装器类.它可以由编译器从boolean自动创建(装箱转换),也可以转换为布尔值(拆箱转换). AtomicBoolean并非如此,因为它是一个为并发目的而设计的单独类.

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

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

The Oracle JDK Javadoc for AtomicBoolean states:

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.

A colleague and I were trying to figure out a use-case where the AtomicBoolean can't be a substitute and the only thing we can think of is that there are methods the Boolean object has that the AtomicBoolean does not.

Is that the only reason or was there something else in mind when that was written?

解决方案

Boolean is the wrapper class around the primitive boolean. It may be automatically created from a boolean by the compiler (boxing conversion) or converted to a boolean (unboxing conversion). This is not the case for AtomicBoolean where it is a separate class designed for concurrency purposes.

Hence the two classes have different semantics at the language level:

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

这篇关于为什么AtomicBoolean不能代替Boolean?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆