讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么通过分析 AQS 的 Node 状态位竞争理解公平锁与非公平锁的吞吐量差异

老萱姑娘_3123

老萱姑娘_3123

发布时间:2026-04-26 15:23:23

|

550人浏览过

|

来源于php中文网

原创

Node.waitStatus直接影响线程是否立即抢锁:非公平锁跳过队列检查直接CAS抢占,公平锁需通过hasQueuedPredecessors()验证waitStatus有效性后才决定入队或放弃。

怎么通过分析 aqs 的 node 状态位竞争理解公平锁与非公平锁的吞吐量差异

Node.waitStatus 怎么影响线程是否立即抢锁

公平锁和非公平锁在 tryAcquire 中的关键分歧,就藏在 hasQueuedPredecessors() 这个判断里——它本质是检查 AQS 同步队列头节点的后继是否为当前线程,也就是「队列里有没有人排在我前面」。这个检查依赖于 CLH 队列中每个 Node 的 waitStatus 字段(如 0、SIGNAL、CANCELLED)是否被正确设置。

非公平锁跳过这步:只要 state == 0,就直接 compareAndSetState(0, 1) 尝试抢占,哪怕队列里已有 5 个 Node 处于 SIGNAL 状态等待唤醒;而公平锁必须先调用 hasQueuedPredecessors(),该方法会读取头节点的 next 字段并判断其 waitStatus 是否有效——若队列不为空,就放弃 CAS,乖乖入队。

这意味着:非公平锁的线程在锁释放瞬间有两次“免排队”机会(lock() 初始 CAS + tryAcquire 再次 CAS),而公平锁只有一次且受队列状态约束。

为什么非公平锁能减少 Node 入队频次

频繁入队意味着更多内存分配、CAS 更新 tail 指针、以及后续可能的线程挂起(LockSupport.park())。这些操作都有开销,尤其在高竞争下会放大。

  • 非公平锁下,一个刚释放锁的线程,很可能被下一个恰好执行 lock() 的线程直接抢到,根本不会走到 addWaiter() 和 acquireQueued()
  • 公平锁强制所有新请求线程都走完整入队流程:新建 Node → CAS 设置为 tail → 设置前驱 waitStatus = SIGNAL → 才进入 park
  • 即使队列里只有 1 个等待者,公平锁也拒绝“插队”,导致本可复用的 CPU 时间片被浪费在上下文切换上

实测场景(100 线程争抢单许可锁)中,非公平锁平均入队率约 30%,公平锁接近 95%——差异直接反映在 Node 实例数量和 GC 压力上。

用于自动切换项目中适合的node 版本
用于自动切换项目中适合的node 版本

根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。

下载

公平锁的队列唤醒路径更长

公平锁要求「头节点释放后,只唤醒 successor」,这依赖 Node 的 waitStatus 被准确维护。但唤醒不是原子动作:unparkSuccessor() 需要遍历 next 链表跳过 CANCELLED 节点,再 CAS 修改目标 Node 的 waitStatus 为 0,最后调用 LockSupport.unpark()。

而非公平锁在 release() 后,如果发现 state 又被新线程通过初始 CAS 抢走,就完全绕过队列唤醒逻辑——连读 head.next 都省了。

关键点:

  • Node 的 waitStatus 不是单纯标记“等待中”,而是参与调度决策的状态机
  • 公平性越强,对 Node 链表结构和 waitStatus 一致性的依赖越重
  • 一旦发生虚假唤醒或 CANCELLED 节点堆积(比如超时 acquire 失败),公平锁的唤醒延迟会明显升高

实际选型时最容易忽略的细节

很多人以为「设成公平锁就能避免饥饿」,但现实是:如果业务本身存在长耗时临界区(比如锁内做 RPC 调用),哪怕用公平锁,后到的线程依然会在队列里等几十毫秒——此时吞吐量下降和响应毛刺并存,反而不如非公平锁配合合理超时控制来得稳定。

真正需要公平锁的场景极少,典型如:资源配额系统(必须严格按申请顺序扣减)、测试环境复现竞态、或监管合规要求「先到先服务」。其余绝大多数 Web/微服务场景,默认非公平锁 + tryLock(timeout) 是更务实的选择。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

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

11757

2023.06.15

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

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

8862

2023.07.05

java自学难吗
java自学难吗

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

7592

2023.07.31

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

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

1244

2023.08.01

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

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

1008

2023.08.02

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

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

1496

2023.08.02

java有什么用
java有什么用

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

3089

2023.08.02

java在线网站
java在线网站

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

20331

2023.08.03

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 11万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 28.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn