第一次看源码,如果有理解不对的地方希望大家可以留下评论谢谢啦。
理解这个类之前需要先理解 java 内存模型
public class AtomicBoolean implements java.io.Serializable {
private static final long serialVersionUID = 4654671469794556979L;
private static final VarHandle VALUE;
static {
try {
MethodHandles.Lookup l = MethodHandles.lookup();
VALUE = l.findVarHandle(AtomicBoolean.class, "value", int.class);
} catch (ReflectiveOperationException e) {
throw new ExceptionInInitializerError(e);
}
}
private volatile int value;
上段代码涉及知识点:
1、Java9以后新增加并延续到JDK11LTS版本的变量句柄`VarHandle`
2、MethodHandles.Lookup
3、static{}代码块和内部类
4、volatile关键字
VarHandle
VarHandle 是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。在各种_访问模式_下都支持访问这些变量,包括普通读/写访问,易失性读/写访问以及比较和交换。这样理解:VarHandle利用访问模式可以用来改变AtomicBoolean的值,访问模式控制原子性和一致性属性
访问模式分为以下几类:
get
,getVolatile
,getAcquire
,getOpaque
。set
,setVolatile
,setRelease
,setOpaque
。compareAndSet
,weakCompareAndSetPlain
,weakCompareAndSet
,weakCompareAndSetAcquire
,weakCompareAndSetRelease
,compareAndExchangeAcquire
,compareAndExchange
,compareAndExchangeRelease
,getAndSet
,getAndSetAcquire
,getAndSetRelease
。getAndAdd
,getAndAddAcquire
,getAndAddRelease
,getAndBitwiseOr
,getAndBitwiseOrAcquire
,getAndBitwiseOrRelease
,getAndBitwiseAnd
,getAndBitwiseAndAcquire
,getAndBitwiseAndRelease
,getAndBitwiseXor
,getAndBitwiseXorAcquire
,getAndBitwiseXorRelease
。 从上面代码可以看出,MethodHandles.Lookup 调用其内部的方法产出了 VarHandle
对象。
MethodHandles.Lookup:一个查找对象是用于创建方法处理,当创建需要访问检查的工厂。方法句柄在调用它们时不执行访问检查,而是在创建它们时执行。因此,在创建方法句柄时必须强制执行方法句柄访问限制。强制执行这些限制的调用者类称为查找类。
需要创建方法句柄的查找类将调用MethodHandles.lookup
为自己创建工厂。当 Lookup
被创建工厂对象,查找类的身份被确定,并安全地存储在 Lookup
对象。然后,查找类(或其委托)可以在 Lookup
对象上使用工厂方法来为访问检查的成员创建方法句柄。这包括允许查找类的所有方法,构造函数和字段,甚至是私有的。简单理解:通过MethodHandles.Lookup反射出某方法/某对象/某成员
查找可能会失败,因为查找类无法访问包含类,或者因为缺少所需的类成员,或者因为查找类无法访问所需的类成员,或者因为查找对象不够信任访问该成员。在任何这些情况下,ReflectiveOperationException
都将从尝试查找中抛出。确切的类将是以下之一:
当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。java 中静态代码块的用法 static 用法详解
内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。Java 内部类详解
整个类的核心就是 volatile
关键字,它保证了变量在线程只见是可见的。volatile 和 synchronized 的区别