Java 中锁机制怎么配合 AQS 抽象队列同步器实现自定义锁

梦枫大大_9349

梦枫大大_9349

2026-08-27

221人浏览

原创

aqs 是 java 并发包中实现锁和同步器的底层骨架,通过封装状态管理、线程排队和唤醒/阻塞等共性逻辑,由子类实现 tryacquire、tryrelease 和 isheldexclusively 等核心方法,并结合 volatile int state 控制锁状态,配合 clh 队列自动管理等待线程,最终通过实现 lock 接口提供标准 api。

java 中锁机制怎么配合 aqs 抽象队列同步器实现自定义锁

AQS 是 Java 并发包中实现锁和同步器的底层骨架,它不直接提供锁,而是把“状态管理”“线程排队”“唤醒/阻塞”这些共性逻辑封装好,把关键决策点留给子类去定义。自定义锁的本质,就是继承 AQS 并按需实现几个核心方法,再用它包装出符合 Lock 接口语义的对外 API。

锁的状态由 state 变量统一控制

AQS 内部用一个 volatile int state 表示同步状态,它的含义完全由你定义。比如:

  • state == 0:表示锁空闲,无人持有
  • state == 1:表示已被某个线程独占(不可重入锁)
  • state > 1:可表示重入次数(如 ReentrantLock)

修改 state 必须保证原子性,所以推荐使用 compareAndSetState(expect, update),它基于 Unsafe 的 CAS 操作,避免竞态。

独占式获取与释放逻辑要自己写

要实现一把互斥锁,必须重写 AQS 的三个关键模板方法:

  • tryAcquire(int arg):尝试获取锁。典型做法是判断 state 是否为 0,若是,用 CAS 将其设为 1,并调用 setExclusiveOwnerThread(Thread.currentThread()) 记录持有者;成功返回 true,失败返回 false
  • tryRelease(int arg):尝试释放锁。先校验当前线程是否为持有者(isHeldExclusively()),再将 state 设为 0、清空 owner 线程;成功返回 true
  • isHeldExclusively():判断当前线程是否正持有该锁,通常只需比较 getExclusiveOwnerThread() == Thread.currentThread()

这些方法不负责线程挂起或排队——那是 AQS 自己在 acquire() 和 release() 中协调完成的。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

等待队列自动管理阻塞线程

当线程调用 lock() 却发现锁已被占,AQS 会把它封装成一个 Node 节点,加入内部的 FIFO 双向链表(CLH 队列变种)。这个过程全自动,无需手动干预。

节点入队后,AQS 会让它在队列中自旋检查前驱是否为头节点;一旦前驱释放锁并唤醒它,它就再次尝试 tryAcquire。整个过程屏蔽了 wait/notify 或 LockSupport.park/unpark 的复杂细节。

对外暴露标准 Lock 接口更实用

虽然 AQS 提供了 acquire(1) 和 release(1),但用户习惯的是 Lock.lock() 和 Lock.unlock()。因此建议让自定义锁类实现 java.util.concurrent.locks.Lock 接口,并在其内部持有一个 AQS 子类实例:

  • lock() 方法内部调用 sync.acquire(1)
  • unlock() 方法内部调用 sync.release(1)
  • 还可选择性实现 newCondition(),返回 sync.newCondition(),支持 await/signal

这样既复用了 AQS 的可靠性,又保持了与 JDK 标准锁一致的编程体验。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9057

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6242

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5592

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1004

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

828

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1176

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2389

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19731

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1075

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习