概述
在介绍AQS之前,我们需要先来了解下Node节点类。
AQS中的核心同步队列(CLH队列的变体)以及条件队列都是依靠Node节点来实现的。
在线程没有竞争到锁资源时,会将线程信息包装成一个Node节点数据,该节点不仅记录了线程信息,还记录了线程的等待状态以及上下节点
引申
AQS作为java中同步器的基石,为了满足不同场景提供了许多不同的基础功能,使用AQS能简单且高效的构造出同步器。
像熟知的ReentrantLock、Semaphore、ReentrantReadWriteLock等,都是基于AQS来实现锁机制的,这个以后有时间也会写。
而为了实现AQS的复杂功能,Node节点类中也是定义了相对较多的常量及变量。
源码
以下是我们Node节点的源代码:
static final class Node {
//标识节点处于共享模式下
static final Node SHARED = new Node();
//标识节点处于独占模式下
static final Node EXCLUSIVE = null;
//已取消 状态
static final int CANCELLED = 1;
//需要唤醒后继节点 状态
static final int SIGNAL = -1;
//等待 状态
static final int CONDITION = -2;
//下一个被获取对象应该无条件传播 状态
static final int PROPAGATE = -3;