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

1. TODO


2. 脑图

  1. Xmind

  2. Edraw

  3. Hexo 地址
    👉 http://blog.wangjia.ink/2025/11/07/源码:java.util.concurrent.locks.Lock源码解析/


3. 基础部分

3.1. Lock 概述

Lock 是一个接口

Lock 为我们提供了以下方法

  1. 竞争锁(阻塞、非阻塞、限时阻塞)
  2. 释放锁(非阻塞)
  3. 创建条件队列(非阻塞)

[!NOTE] 注意事项

  1. Monitor 中有竞争队列、等待队列,AQS 中有同步队列、条件队列

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

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

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

// 用于非阻塞竞争锁
//
// 如果成功,返回 true
//
// 如果失败,返回 false
//
// 所谓的 “非阻塞” 是指:尝试一下,行就行,不行就不行,不要让当前线程进入阻塞(BWTW)状态
boolean tryLock();

// 用于限时阻塞竞争锁
//
// 限时阻塞被允许的最长时间为:time unit
// 1. 如果超时,将返回 false
//
// 如果锁被其他线程持有,本地线程进入阻塞状态,Thread 实例进入 TIMED_WAITING 状态,并被投递到 AQS 的同步队列,等待被唤醒(LockSupport.unpark)
//
// 本地线程进入阻塞状态,Thread 实例进入 TIMED_WAITING 状态后,能响应中断。线程被唤醒,重新获得 CPU 时间片后,会抛出 InterruptedException 受检异常,并清除 Thread 实例的中断状态(异常退出或正常退出(发生异常),要看我们是否对该异常进行捕获并处理)
//
// 如果成功,返回 true
//
// 如果失败,返回 false
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

// 用于非阻塞释放当前线程持有的锁
//
// 如果不持有锁的线程释放锁,抛出 IllegalMonitorStateException 非受检异常
void unlock();

// 用于非阻塞创建条件队列
Condition newCondition();

}


源码:java.util.concurrent.locks.Lock 源码解析
https://wangjia5289.github.io/2025/11/07/源码:java.util.concurrent.locks.Lock源码解析/
Author
咸阳猴🐒
Posted on
November 7, 2025
Licensed under