当前位置: 首页 > news >正文

【多线程】一文吃透 AQS 原理

在 Java 并发包中,很多重量级组件都依赖一个共同的底层框架——AQS。可以说:

不懂 AQS,就很难真正理解 ReentrantLock、Semaphore、CountDownLatch 等工具的实现原理。

本文将从设计思想、核心结构、源码流程和实战应用等方面介绍 AQS。


文章目录

    • 一、什么是 AQS?
      • 1. AQS 的定义
      • 2. 哪些组件基于 AQS?
    • 二、为什么需要 AQS?
    • 三、AQS 的核心思想
      • 1. 状态变量(State)
      • 2. CLH 双向等待队列
      • 3. CAS + 自旋
    • 四、AQS 的核心结构
      • 1. Node 节点结构
      • 2. 同步队列结构
    • 五、AQS 获取锁流程(以独占锁为例)
      • 1. 获取锁流程
      • 2. 核心源码流程(简化版)
    • 六、AQS 释放锁流程
    • 七、共享锁模式
      • 共享模式特点
    • 八、实战:手写一个简易锁
    • 九、AQS 的优缺点
      • 优点
      • 缺点
    • 十、面试高频问题
      • 1. AQS 核心组成?
      • 2. AQS 如何保证线程安全?
      • 3. 公平锁如何实现?
    • 参考

一、什么是 AQS?

1. AQS 的定义

AQS(AbstractQueuedSynchronizer,抽象队列同步器),是 JDK 提供的一个用于构建锁和同步器的基础框架。

本质上:

AQS = 状态管理 + 等待队列 + 线程调度。

很多并发工具,都是在 AQS 基础上“搭积木”实现的。


2. 哪些组件基于 AQS?

常见基于 AQS 的组件包括:

  • ReentrantLock
  • Semaphore
  • CountDownLatch
  • ReentrantReadWriteLock
  • FutureTask

它们底层都复用了 AQS 的核心机制。


二、为什么需要 AQS?

在 AQS 出现之前,每个锁都要自己处理:

  • 线程阻塞
  • 队列管理
  • 唤醒机制

问题:

  • 重复造轮子
  • 易出 Bug
  • 难维护

AQS 的目标:

把“排队 + 阻塞 + 唤醒”统一封装。

开发者只需关注:如何获取和释放资源。


三、AQS 的核心思想

AQS 的设计基于三大核心思想:

1. 状态变量(State)

AQS 内部维护一个volatile int state

privatevolatileintstate;

含义由子类决定:

  • ReentrantLock:锁重入次数
  • Semaphore:剩余许可数
  • CountDownLatch:计数器

2. CLH 双向等待队列

AQS 内部维护一个 FIFO 双向队列,用于存放等待线程。

特点:

  • 先进先出
  • 公平性保障
  • 基于 CLH 变种实现

结构示意:

Head <-> Node <-> Node <-> Tail

3. CAS + 自旋

AQS 使用 CAS 修改 state:

compareAndSetState(old,new)

保证修改原子性。


四、AQS 的核心结构

1. Node 节点结构

每个等待线程都会被包装成 Node:

主要字段:

  • thread:线程引用
  • prev / next:队列指针
  • waitStatus:状态标识

常见状态:

状态值含义
0默认
SIGNAL等待唤醒
CANCELLED已取消

2. 同步队列结构

AQS 内部维护:

volatileNodehead;volatileNodetail;

组成双向链表。


五、AQS 获取锁流程(以独占锁为例)

以 ReentrantLock 为例:

1. 获取锁流程

详细步骤:

  1. CAS 尝试修改 state
  2. 成功则获得锁
  3. 失败则进入等待队列
  4. 挂起线程(park)
  5. 被唤醒后再次竞争

2. 核心源码流程(简化版)

if(!tryAcquire(arg)){addWaiter();acquireQueued();}

体现:先抢锁,抢不到再排队。


六、AQS 释放锁流程

释放流程:

  1. tryRelease 修改 state
  2. state = 0 时释放成功
  3. 唤醒队头节点
  4. unpark 后继线程

示意:

释放 → 唤醒 → 竞争

七、共享锁模式

AQS 支持两种模式:

模式说明示例
独占同一时刻一个线程ReentrantLock
共享多线程同时访问Semaphore

共享模式特点

  • 多个线程可同时获取
  • 通过 state 控制数量

八、实战:手写一个简易锁

基于 AQS 实现自定义锁:

classMyLockextendsAbstractQueuedSynchronizer{@OverrideprotectedbooleantryAcquire(intarg){returncompareAndSetState(0,1);}@OverrideprotectedbooleantryRelease(intarg){setState(0);returntrue;}}

使用:

MyLocklock=newMyLock();lock.acquire(1);try{// 业务逻辑}finally{lock.release(1);}

九、AQS 的优缺点

优点

  • 高度复用
  • 结构清晰
  • 扩展性强
  • 性能优秀

缺点

  • 学习成本高
  • 源码复杂
  • 调试困难

十、面试高频问题

1. AQS 核心组成?

答:

state + 队列 + CAS + park/unpark。


2. AQS 如何保证线程安全?

答:

CAS + volatile + 队列。


3. 公平锁如何实现?

答:

先判断队列是否有前驱节点。


参考

AQS 详解

bilibili.com

http://www.jsqmd.com/news/392449/

相关文章:

  • 电磁兼容仿真:电磁干扰分析_(13).电磁兼容设计中的材料选择与应用
  • 电磁兼容仿真:电磁干扰分析_(15).电磁兼容性在无线通信系统中的应用
  • 电磁兼容仿真:电磁敏感性分析_(2).电磁敏感性概述
  • 电磁兼容仿真:电磁敏感性分析_(4).电磁测试与测量技术
  • GPU架构学习笔记(面试精炼版)
  • 电磁兼容仿真:电磁干扰分析_(14).电磁兼容性与人体健康安全
  • 电磁兼容仿真:电磁敏感性分析_(1).电磁兼容性基础理论
  • 电磁兼容仿真:电磁敏感性分析_(3).电磁干扰源分析
  • 基于OceanBase的行列混合存储架构适配HTAP的方案改造
  • 题解:洛谷 P1496 火烧赤壁
  • 2026年仿真计算对电脑的要求深度解析:从硬件选型到算力专业的方案的全维度适配指南
  • 题解:洛谷 P3397 地毯
  • 题解:洛谷 P2367 语文成绩
  • 孤能子视角:全国女婿回丈母娘家 全国儿媳在婆家的统一状态
  • 深入解析:Transformer 大模型架构深度解析(2)RNN 循环神经网络模型在 NLP 中的应用
  • 踩下电门的时候有没有想过,你脚下的电流到底经历了多少层运算?今天咱们扒开某新能源车企研发部的仿真模型,看看他们怎么用Simulink把电动车拆解得明明白白
  • AI大模型学习路线图:小白也能轻松入门,内含收藏资源包!AI大模型学习路线及相关资源推荐
  • 小白/程序员必看:2026年AI大模型生产力转型与Agentic AIOps落地指南
  • Qwen3.5:开启智能体时代,收藏这份国产大模型学习指南!
  • 2026年Q1宁波靠谱装修设计公司盘点:口碑榜单大公开 - 疯一样的风
  • 题解:洛谷 P1314 [NOIP 2011 提高组] 聪明的质监员
  • 大模型算法岗平均月薪达6.8w?程序员小白转行必看:AI大模型训练师的机遇与未来
  • AI入坑指南:收藏这份岗位选择攻略,小白也能快速找到适合你的方向
  • Android开发工程师面试题与答案集
  • 企业H5站点升级PWA (九)
  • 题解:洛谷 P1719 最大加权矩形
  • 题解:洛谷 P8218 【深进1.例1】求区间和
  • 题解:洛谷 P1069 [NOIP 2009 普及组] 细胞分裂
  • Android Framework 开发工程师
  • AI原生应用个性化定制,提升产品差异化