为什么需要AtomicBoolean
对于int或者long型变量,需要进行加减操作,所以要加锁;但对于一个boolean类型来说,true或false的赋值和取值操作,加上volatile关键字就够了,为什么还需要AtomicBoolean呢?
这是因为往往要实现下面这种功能:
也就是要实现 compare和set两个操作合在一起的原子性,而这也正是CAS提供的功能。上面的代码,就变成:
同样地,AtomicReference也需要同样的功能,对应的函数如下:
其中,expect是旧的引用,update为新的引用。
如何支持boolean和double类型
在Unsafe类中,只提供了三种类型的CAS操作:int、long、Object(也就是引用类型)。如下所示。
第一个参数是要修改的对象,第二个参数是对象的成员变量在内存中的位置(一个long型的整数),第三个参数是该变量的旧值,第四个参数是该变量的新值。
AtomicBoolean类型怎么支持呢?
对于用int型来代替的,在入参的时候,将boolean类型转换成int类型;在返回值的时候,将int类型转换成boolean类型。如下所示。
如果是double类型,又如何支持呢?
这依赖double类型提供的一对double类型和long类型互转的函数,这点在介绍DoubleAdder的时候会提到。
本篇给大家讲解的内容是JDK源码剖析之Atomic类——AtomicBoolean和AtomicReference
下篇文章给大家介绍的内容是JDK源码剖析之Atomic类——AtomicStampedReference和AtomicMarkableReference