用于AtomicBoolean的Oracle声明:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html
可以原子地更新的布尔值。有关原子变量属性的描述,请参阅java.util.concurrent.atomic包规范。AtomicBoolean在诸如原子更新标志之类的应用程序中使用,不能用作布尔值的替代。
我和一位同事试图找出一个用例,在这个用例中,AtomicBoolean不能替代,我们唯一能想到的就是布尔对象有一些AtomicBoolean没有的方法。
这是唯一的原因,还是在写的时候有其他的想法?
发布于 2016-04-29 14:59:23
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发布于 2016-04-29 15:11:25
布尔值是不可变的值对象。它的设计是不变的,并成为最终的,以强制执行。java.lang.Boolean从1.0开始就已经出现了。
AtomicBoolean是可变的,其设计是为了更新,以便更新后的值在线程之间可见。AtomicBoolean是在Java5中引入的。
这些是完全不同的概念,这就是为什么AtomicBoolean不是为了扩展布尔值而设计的。如果不破坏代码的预期不变量,就不能用可变对象替换不可变的对象。期望接收不可变值的代码可能会被破坏,如果原子版本可以被传递到它的位置。
这里有一个用例:如果AtomicBoolean是作为布尔值的替代物引入的,那么在这个更改之前创建的类可以合理地预期,在某些返回布尔值的方法中,它不需要传递防御副本,因为布尔是不可变的。如果返回的引用碰巧是从更改为使用AtomicBoolean而不是布尔值的源中初始化的,那么该字段现在可以通过调用返回布尔值的方法进行修改,方法是将其转换为AtomicBoolean。
原子类是为处理并发更新而设计的(作为对volatile的改进),但是设计并发代码最有效的方法是使用不变的值。因此,不要将AtomicBoolean误认为是“编写多线程代码时使用的布尔值”。
发布于 2016-04-29 14:59:44
它们不能自动装箱,所以不能在条件词中使用,例如,
// Explodey
if (someAtomicBoolean) {
}https://stackoverflow.com/questions/36941526
复制相似问题