源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node 源码解析

1. TODO


2. 脑图

  1. Xmind

  2. Edraw

  3. Hexo 地址
    👉 http://blog.wangjia.ink/2025/08/31/源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node源码解析/


3. 基础部分

3.1. AbstractQueuedSynchronizer.Node 概述

AbstractQueuedSynchronizer.Node 是一个抽象类,是 java.util.concurrent.locks.AbstractQueuedSynchronizer 的静态内部类

AQS 的同步队列就是由 AbstractQueuedSynchronizer.Node 构建的,基于双向链表的队列

[!NOTE] 注意事项

  1. 详见源码:AbstractQueuedSynchronizer
    1. obsidian 内部链接:
      1. 源码:java.util.concurrent.locks.AbstractQueuedSynchronizer源码解析
    2. Hexo 链接:
      1. http://blog.wangjia.ink/2025/09/01/源码:java.util.concurrent.locks.AbstractQueuedSynchronizer源码解析/
  2. 在最初的设计里,Node 只是一个具体类,职责非常单纯,充当同步队列中的节点。但随着并发框架的发展,设计者意识到队列节点本身需要承载两种不同的语义:独占 (exclusive) 和 共享 (shared)
    1. 为了更好地表达这一点,他们将 Node 改为抽象类。尽管 Node 中并没有抽象方法,看起来 “抽象” 似乎多此一举,但这样设计的核心目的,是阻止开发者直接去实例化一个原始的 Node
    2. 取而代之的是,框架定义了两个具体子类:ExclusiveNode 和 SharedNode。这两个类除了继承 Node 外没有任何额外逻辑,但却起到了“标记” 的作用,明确区分了节点的语义。这样一来,开发者所创建的不是一个模糊的 “队列节点”,而是一个语义清晰的 “独占节点” 或 “共享节点”

3.2. AbstractQueuedSynchronizer.Node 相关状态

  1. 0
    1. 表示节点的初始状态
  2. 1
    1. 表示 Thread 实例可能因为阻塞超时、被中断后响应中断而结束阻塞
    2. 我们可以简单的理解为:节点已经结束等待了
  3. -1
    1. 表示节点的后驱节点需要被唤醒
    2. 该状态是由后驱节点为该节点设置的,当该节点释放 State 时,需要负责唤醒后驱节点
  4. -2
    1. 表示节点不在 AQS 的同步队列,而是在 AQS 的条件队列
  5. -3
    1. 该状态仅用于共享模式的同步器,因为共享模式中可能会有多个线程同时尝试获取共享资源
    2. 当该节点被唤醒后,会继续唤醒后续节点。被唤醒的后续节点会再唤醒后续节点,形成 “级联唤醒”

[!NOTE] 注意事项

  1. 这一套相关状态是在 Java8 下的相关状态,在 Java17+ 发生了较大变化

4. 源码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
abstract static class Node {

// 表示该节点在 AQS 的同步队列中的前驱节点
volatile Node prev;

// 表示该节点在 AQS 的同步队列中的后驱节点
volatile Node next;

// 表示该节点封装的 Thread 实例
Thread waiter;

// 表示该节点的状态
volatile int status;

final boolean casPrev(Node c, Node v) {
return U.weakCompareAndSetReference(this, PREV, c, v);
}

final boolean casNext(Node c, Node v) {
return U.weakCompareAndSetReference(this, NEXT, c, v);
}

final int getAndUnsetStatus(int v) {
return U.getAndBitwiseAndInt(this, STATUS, ~v);
}

final void setPrevRelaxed(Node p) {
U.putReference(this, PREV, p);
}

final void setStatusRelaxed(int s) {
U.putInt(this, STATUS, s);
}

final void clearStatus() {
U.putIntOpaque(this, STATUS, 0);
}

private static final long STATUS
= U.objectFieldOffset(Node.class, "status");

private static final long NEXT
= U.objectFieldOffset(Node.class, "next");

private static final long PREV
= U.objectFieldOffset(Node.class, "prev");

}

[!NOTE] 注意事项

  1. 方法的实现涉及到了 Unsafe,先不看


源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node 源码解析
https://wangjia5289.github.io/2025/08/31/源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.Node源码解析/
Author
咸阳猴🐒
Posted on
August 31, 2025
Licensed under