AQS 原理详解
一、什么是 AQS它的作用是什么AQS 全称是 AbstractQueuedSynchronizer即抽象队列同步器它是 Java 并发包的核心基础组件。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程等功能并提供等待队列模型的线程同步框架。AQS 的核心作用可以概括为两点统一管理同步状态通过 state 变量统一表示锁的占用情况比如 ReentrantLock 用 state 表示重入次数Semaphore 用 state 表示剩余许可数量。统一管理线程排队当线程获取锁失败时不需要自己实现等待队列AQS 会自动将线程包装成 Node 节点放入 CLH 队列中并负责线程的阻塞、唤醒和排队逻辑。二、AQS 的组成包含哪些内容AQS 的内部结构主要由以下几个核心部分组成同步状态 state一个volatile修饰的int类型全局成员变量state来表示同步状态在排队加锁的过程中通过CAS完成对state值的修改。CLH 等待队列一个虚拟的 FIFO 双向队列队列中的每个节点代表一个等待获取锁的线程。队列的头节点是当前持有锁的线程后续节点按顺序排队等待。Node 节点等待队列中的每个线程都被封装成一个 Node 对象Node 中记录了线程引用、等待状态waitStatus、前驱节点和后继节点的引用。三、AQS 独占锁的获取流程独占锁的获取主要入口是 acquire() 方法整个流程可以分为以下几个步骤步骤一快速尝试获取锁首先调用 tryAcquire(arg) 方法由子类实现具体的获取逻辑。如果 tryAcquire 返回 true说明获取锁成功方法直接返回线程继续执行后续业务代码。步骤二入队操作如果 tryAcquire 返回 false说明锁已被其他线程占用当前线程需要排队。AQS 会调用 addWaiter(Node.EXCLUSIVE) 方法将当前线程包装成一个独占模式的 Node 节点并通过 CAS 操作将其添加到 CLH 队列的尾部。步骤三自旋阻塞入队后调用 acquireQueued方法进入自旋等待状态。线程会不断检查自己的前驱节点是否为头节点如果是头节点就再次尝试获取锁tryAcquire。如果获取成功将自己设置为新的头节点并返回中断状态。步骤四挂起线程如果前驱节点不是头节点或者再次尝试获取锁失败AQS 会检查前驱节点的 waitStatus。如果前驱节点的 waitStatus 为 SIGNAL说明前驱节点承诺会在释放锁时唤醒自己当前线程就可以安全地调用 LockSupport.park(this) 将自己挂起等待被唤醒。步骤五锁释放与唤醒当持有锁的线程调用 release(arg) 方法时AQS 会调用 tryRelease(arg) 释放锁。如果释放成功会检查头节点的 waitStatus如果为 SIGNAL就通过 unparkSuccessor 方法唤醒头节点的后继节点被唤醒的线程会从 park 处继续执行重新进入自旋获取锁的流程。整个流程可以概括为尝试获取 → 获取失败则入队 → 判断前驱节点 → 根据情况自旋或挂起 → 等待前驱节点释放后唤醒。四、共享模式和独占模式有什么区别独占模式下同一时刻只有一个线程可以持有锁其他线程必须排队等待典型代表是 ReentrantLock。共享模式下同一时刻允许多个线程同时持有锁。独占模式适用于互斥资源访问适用于写多读少的场景共享模式适用于读多写少的场景比如读锁允许多个线程同时读取数据提高并发性能。五、AQS 的公平锁和非公平锁有什么区别公平锁和非公平锁的区别主要体现在新线程尝试获取锁时的行为以 ReentrantLock 为例公平锁FairSync在调用 tryAcquire 时即使当前 state 为 0锁未被占用公平锁也不会直接获取锁而是先检查 CLH 队列中是否有其他线程等待了更长时间。如果队列中已有等待线程当前线程会放弃抢占直接加入队尾排队。这保证了先到先得的原则线程按请求顺序获取锁。非公平锁NonfairSync在调用 tryAcquire 时如果 state 为 0非公平锁会直接尝试通过 CAS 修改 state 来抢占锁不关心队列中是否有等待线程。新来的线程有可能插队直接抢到锁而已经在队列中等待的线程可能继续等待。非公平锁在多线程竞争激烈时性能通常更高因为它减少了线程切换和唤醒的开销。性能差异非公平锁由于允许插队减少了线程上下文切换的次数整体吞吐量更高是 ReentrantLock 的默认实现。公平锁虽然保证了公平性但每次获取锁都需要检查队列且频繁的线程切换会导致性能下降。

相关新闻

【会?】workbuddy 装的各种 skill  【待测试】全程自动接待客户

【会?】workbuddy 装的各种 skill 【待测试】全程自动接待客户

1)抖音博主:飞飞AI奇思妙想抖音号:tiantianbuluo122) 全程自动接待客户5.87 复制打开抖音,看看【YYY-t的作品】阿里国际自动接待Agent 通过建立知识库,搭建接... https://v.douyin.com/-rhoyZqfCDI/ 11/12 :4pm Duf:/ …

2026/10/4 16:41:55 阅读更多 →
每日问答中间件MYSQL篇

每日问答中间件MYSQL篇

每日问答mysql篇 1.InnoDB 为什么选用 B 树做索引,而不用 B 树、哈希索引? InnoDB 选用 B 树:①非叶子节点只存索引键,一页存放更多索引,树矮,磁盘 IO 少;②叶子节点双向链表,非…

2026/10/3 14:39:47 阅读更多 →
抖音视频无水印下载教程:三步保存你喜欢的每一段短视频

抖音视频无水印下载教程:三步保存你喜欢的每一段短视频

抖音视频无水印下载教程:三步保存你喜欢的每一段短视频 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载:https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 想要抖音视…

2026/10/4 7:44:21 阅读更多 →

最新新闻

【Claude Code】“源码”解读(一):架构总览与设计哲学——为什么 Claude 和 GPT 不一样?TaoToken 统一 Key 通道的接入视角

【Claude Code】“源码”解读(一):架构总览与设计哲学——为什么 Claude 和 GPT 不一样?TaoToken 统一 Key 通道的接入视角

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 10:44:39 阅读更多 →
GoWind Admin:内置微服务接口聚合的企业级全栈中后台框架

GoWind Admin:内置微服务接口聚合的企业级全栈中后台框架

1. 项目概述:这套全栈中后台框架到底解决什么问题做中后台开发这么多年,我最大的感受是:大部分企业项目真正花时间的不是业务逻辑本身,而是那些“看起来很简单、做起来全是坑”的基础设施——登录鉴权、权限路由、菜单管理、用户角…

2026/10/12 10:44:39 阅读更多 →
不加班也能持续成长:AI工程师的高效学习与时间管理实战指南

不加班也能持续成长:AI工程师的高效学习与时间管理实战指南

先给自己泼一盆冷水:作为一名在职AI工程师,你大概率已经发现一个扎心的事实——技术栈更新快到你还没把上一套框架吃透,新一代大模型又已经刷屏了。GitHub上每天上百个新仓库冒出来,ArXiv上论文刷得比朋友圈还勤快。如果不持续学习…

2026/10/12 10:44:39 阅读更多 →
cProfile报错ProfilerNotRunningError:原因、排查与正确用法

cProfile报错ProfilerNotRunningError:原因、排查与正确用法

1. 报错现场:一个看似“莫名其妙”的性能分析异常先看一段触发了这个报错的代码:import cProfileprof cProfile.Profile() # 注意:这里没有调用 prof.enable() 或 prof.enable() 在别处被调用了但没有生效 # ... 执行需要分析的代码 ... pro…

2026/10/12 10:44:39 阅读更多 →
基于SSM与MySQL的网上选课系统设计与实现

基于SSM与MySQL的网上选课系统设计与实现

1. 网上选课系统的核心需求与设计思路先说结论:网上选课系统的本质,就是把传统教务场景里的人工选课流程搬到线上,让"课程资源分配"这件事变得更透明、更高效。听起来简单,但真正动手写代码之前,如果不对需求…

2026/10/12 10:44:39 阅读更多 →
Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

1. 一个被遗忘的注解,为什么还值得聊Required这个注解,如果你是从 Spring Boot 时代入行的,大概率没见过它,甚至在 IDE 里敲出来会发现它上面压着一道醒目的删除线。它属于那种"存在于文档里、消失在代码里"的元老级 AP…

2026/10/12 10:43:37 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →