源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node 源码解析
1. TODO
2. 脑图
Xmind
Edraw
3. 基础部分
3.1. AbstractQueuedSynchronizer.Node 概述
AbstractQueuedSynchronizer.Node 是一个抽象类,是 java.util.concurrent.locks.AbstractQueuedSynchronizer 的静态内部类
AQS 的同步队列就是由 AbstractQueuedSynchronizer.Node 构建的,基于双向链表的队列
[!NOTE] 注意事项
- 详见源码:
AbstractQueuedSynchronizer- 在最初的设计里,
Node只是一个具体类,职责非常单纯,充当同步队列中的节点。但随着并发框架的发展,设计者意识到队列节点本身需要承载两种不同的语义:独占 (exclusive) 和 共享 (shared)
- 为了更好地表达这一点,他们将
Node改为抽象类。尽管Node中并没有抽象方法,看起来 “抽象” 似乎多此一举,但这样设计的核心目的,是阻止开发者直接去实例化一个原始的Node- 取而代之的是,框架定义了两个具体子类:
ExclusiveNode和SharedNode。这两个类除了继承Node外没有任何额外逻辑,但却起到了“标记” 的作用,明确区分了节点的语义。这样一来,开发者所创建的不是一个模糊的 “队列节点”,而是一个语义清晰的 “独占节点” 或 “共享节点”
3.2. AbstractQueuedSynchronizer.Node 相关状态
0- 表示节点的初始状态
1- 表示
Thread实例可能因为阻塞超时、被中断后响应中断而结束阻塞 - 我们可以简单的理解为:节点已经结束等待了
- 表示
-1- 表示节点的后驱节点需要被唤醒
- 该状态是由后驱节点为该节点设置的,当该节点释放
State时,需要负责唤醒后驱节点
-2- 表示节点不在
AQS的同步队列,而是在AQS的条件队列
- 表示节点不在
-3- 该状态仅用于共享模式的同步器,因为共享模式中可能会有多个线程同时尝试获取共享资源
- 当该节点被唤醒后,会继续唤醒后续节点。被唤醒的后续节点会再唤醒后续节点,形成 “级联唤醒”
[!NOTE] 注意事项
- 这一套相关状态是在
Java8下的相关状态,在Java17+发生了较大变化
4. 源码部分
1 | |
[!NOTE] 注意事项
- 方法的实现涉及到了
Unsafe,先不看
源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node 源码解析
https://wangjia5289.github.io/2025/08/31/源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node源码解析/