源码:java.util.concurrent.locks.Condition 源码解析

1. TODO


2. 脑图

  1. Xmind

  2. Edraw

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


3. 基础部分

3.1. Condition 概述

Condition 是一个接口

想象这样一个问题:Monitor 中只有一个等待队列(即 WaitSet)如果你有多个条件需要等待,你就无法精确控制唤醒哪一类等待者,因为他们都在同一个队列中等待

为了解决这一问题,我们可以创建多个 Condition 接口的具体实现类实例,每一个 Condition 接口的具体实现类就是一个队列

Condition + LockSupport 相当于 Object#waitObject#notifyPlus

Condition 为我们提供了以下方法:

  1. 让本地线程进入阻塞状态,Thread 示例进入 WAITING 状态
  2. 让本地线程进入限时阻塞状态,Thread 示例进入 TIMED_WAITING 状态
  3. 唤醒 AQS 的条件队列中的 “首个” Thread 实例(非阻塞)
  4. 唤醒 AQS 的条件队列中的所有 Thread 实例(非阻塞)

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
public interface Condition {

// 用于让本地线程进入阻塞状态,Thread 示例进入 WAITING 状态,并被投递到 AQS 的条件队列,等待被唤醒(LockSupport.unpark)、被中断(Thread#interrupt)
//
// 本地线程进入阻塞状态,Thread 实例进入 WAITING 状态后,能响应中断。线程被唤醒,重新获得 CPU 时间片后,会抛出 InterruptedException 受检异常,并清除 Thread 实例的中断状态(异常退出或正常退出(发生异常),要看我们是否对该异常进行捕获并处理)
void await() throws InterruptedException;

// 用于让本地线程进入阻塞状态,Thread 示例进入 WAITING 状态,并被投递到 AQS 的条件队列,等待被唤醒(LockSupport.unpark)
//
// 本地线程进入阻塞状态,Thread 实例进入 WAITING 状态后,不能能响应中断。线程会继续阻塞,并会保留 Thread 示例的中断状态。当线程被唤醒后,会继续向下执行(正常退出(未发生异常))
void awaitUninterruptibly();

// 用于让本地线程进入限时阻塞状态,Thread 示例进入 TIMED_WAITING 状态,并被投递到 AQS 的条件队列,等待被唤醒(LockSupport.unpark)、被中断(Thread#interrupt)、阻塞超时
//
// 限时超时被允许的最长时间为:nanosTimeout ns
// 1. 如果超时,false
//
// 本地线程进入阻塞状态,Thread 实例进入 WAITING 状态后,能响应中断。线程被唤醒,重新获得 CPU 时间片后,会抛出 InterruptedException 受检异常,并清除 Thread 实例的中断状态(异常退出或正常退出(发生异常),要看我们是否对该异常进行捕获并处理)
long awaitNanos(long nanosTimeout) throws InterruptedException;

// 用于让本地线程进入限时阻塞状态,Thread 示例进入 TIMED_WAITING 状态,并被投递到 AQS 的条件队列,等待被唤醒(LockSupport.unpark)、被中断(Thread#interrupt)、阻塞超时
//
// 限时阻塞被允许的最长时间为:time unit
// 1. 如果超时,返回 false
//
// 本地线程进入阻塞状态,Thread 实例进入 WAITING 状态后,能响应中断。线程被唤醒,重新获得 CPU 时间片后,会抛出 InterruptedException 受检异常,并清除 Thread 实例的中断状态(异常退出或正常退出(发生异常),要看我们是否对该异常进行捕获并处理)
boolean await(long time, TimeUnit unit) throws InterruptedException;

// 用于让本地线程进入限时阻塞状态,Thread 示例进入 TIMED_WAITING 状态,并被投递到 AQS 的条件队列,等待被唤醒(LockSupport.unpark)、被中断(Thread#interrupt)、阻塞超时
//
// 限时阻塞被允许到 deadline
// 1. 如果超时,返回 false
//
// 本地线程进入阻塞状态,Thread 实例进入 WAITING 状态后,能响应中断。线程被唤醒,重新获得 CPU 时间片后,会抛出 InterruptedException 受检异常,并清除 Thread 实例的中断状态(异常退出或正常退出(发生异常),要看我们是否对该异常进行捕获并处理)
boolean awaitUntil(Date deadline) throws InterruptedException;

// 用于非阻塞唤醒 AQS 的条件队列中的 “首个” Thread 实例,被唤醒的 Thread 实例被直接投递到 AQS 的同步队列
//
// 所谓的 “首个” 是指:首个 Thread 实例可能因为阻塞超时、被中断后响应中断而结束阻塞,所以会依次向后查找,直到找到仍处于阻塞状态的 Thread 实例
void signal();

// 用于非阻塞唤醒 AQS 的条件队列中的所有 Thread 实例,被唤醒的 Thread 实例被直接投递到 AQS 的同步队列
void signalAll();

}

5. 内置实现

5.1. ConditionObject

详见源码:AbstractQueuedSynchronizer.ConditionObject

  1. obsidian 内部链接:
    1. 源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject源码解析
  2. Hexo 链接:
    1. http://blog.wangjia.ink/2025/08/31/源码:java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject源码解析/


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