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

Updated on in Java是世界上最好的语言 with 0 views and 0 comments

  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 的区别


标题:JDK11-juc包系列之atomic的AtomicBoolean类(一)
作者:MaidongAndYida
地址:https://cuijianzhe.github.io/articles/2019/03/23/1553320766611.html