基本概念
首先我们需要知道两个概念:AQS、CHL 队列。
AQS:即 AbstractQueuedSynchronizer 类,它是整个 J.U.C 框架的核心所在。其中之一的功能就是将线程封装在一个节点里面,不同的节点通过连接形成了一个 CHL 队列。
CHL 队列:它是一个非阻塞的 FIFO 队列,也就是说在并发条件下往此队列做插入或移除操作不会阻塞,它通过自旋锁和 CAS 保证节点插入和移除的原子性,实现无锁快速插入。
CHL 队列比起原来的 CLH 锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机制。
在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用。
在等待机制上由原来的自旋改成阻塞唤醒。
节点元素
在 AQS 中,CHL 队列实际是由节点组成的链表。那么就需要知道它的节点构成。首先来看它的一个静态内部类:
static final class Node {
// 省略部分代码...
volatile Node prev; // 前节点
volatile Node next; // 后节点
volatile int waitStatus;// 等待状态
volatile Thread thread; // 节点线程
Node nextWaiter; // 节点模式
Node() { }
Node(Thread thread, Node mode) {
this.nextWaiter = mode;
this.thread = thread;