文章 96
评论 76
浏览 89991
JDK11-juc包系列之atomic的AtomicBoolean类(一)

JDK11-juc包系列之atomic的AtomicBoolean类(一)

11.jpg

第一次看源码,如果有理解不对的地方希望大家可以留下评论谢谢啦。

理解这个类之前需要先理解java内存模型


51-63 line

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关键字

1、Java9 以后新增加并延续到 JDK11LTS 版本的变量句柄VarHandle

VarHandle 是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。在各种_访问模式_下都支持访问这些变量,包括普通读/写访问,易失性读/写访问以及比较和交换。这样理解:VarHandle利用访问模式可以用来改变AtomicBoolean的值,访问模式控制原子性和一致性属性

访问模式分为以下几类:

MethodHandles.Lookup

从上面代码可以看出,MethodHandles.Lookup 调用其内部的方法产出了VarHandle对象。

MethodHandles.Lookup:一个查找对象是用于创建方法处理,当创建需要访问检查的工厂。方法句柄在调用它们时不执行访问检查,而是在创建它们时执行。因此,在创建方法句柄时必须强制执行方法句柄访问限制。强制执行这些限制的调用者类称为查找类

需要创建方法句柄的查找类将调用MethodHandles.lookup为自己创建工厂。当Lookup被创建工厂对象,查找类的身份被确定,并安全地存储在Lookup对象。然后,查找类(或其委托)可以在Lookup对象上使用工厂方法来为访问检查的成员创建方法句柄。这包括允许查找类的所有方法,构造函数和字段,甚至是私有的。简单理解:通过MethodHandles.Lookup反射出某方法/某对象/某成员

查找可能会失败,因为查找类无法访问包含类,或者因为缺少所需的类成员,或者因为查找类无法访问所需的类成员,或者因为查找对象不够信任访问该成员。在任何这些情况下,ReflectiveOperationException都将从尝试查找中抛出。确切的类将是以下之一:

  • NoSuchMethodException - 如果请求方法但不存在
  • NoSuchFieldException - 如果请求了一个字段但不存在
  • IllegalAccessException - 如果成员存在但访问检查失败

static{}代码块和内部类

当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。java中静态代码块的用法 static用法详解

内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。Java内部类详解

volatile 关键字

整个类的核心就是volatile关键字,它保证了变量在线程只见是可见的。volatile和synchronized的区别



记录精彩的坎坷人生,经营属于自己的世界!