[toc]
前言
AutomicBoolean的源码和AutomicReference的源码基本和AutomicInteger与AutomicLong源码一致,因此只介绍部分不同点
AutomicBoolean源码阅读
在Unsafe
类中,只提供了三种类型的CAS
操作:int
、long
、Object
(也就是引用类型)
第一个参数是要修改的对象,第二个参数是对象的成员变量在内存中的位置(一个long
型的整数),第三个参数是该变量的旧值,第四个参数是该变量的新值。
1 | public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5); |
对于用int型来代替的,在入参的时候,将boolean类型转换成int类型;在返回值的时候,将int类型转换成boolean类型
在AutomicBoolean
中通过int类型来代替boolean
类型,当值为0
时对应的boolean
的值是false
,当值为1
时,对应的boolan的值是true
1 |
|
使用static说明是类级别的,所有实例对象公用的,在转化的时候,先通过反射(getDeclaredField)获取value成员变量对应的Field对象,再通过objectFieldOffset函数转化成valueOffset。此处的valueOffset就代表了value变量本身,后面执行CAS操作的时候,不是直接操作value,而是操作valueOffset。
1 | static { |
AutomicReference源码阅读
Reference类型的对应Object
1 | public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6); |
1 | package java.util.concurrent.atomic; |