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

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

轻墨同学_9825

轻墨同学_9825

发布时间:2026-05-05 16:14:35

|

471人浏览过

|

来源于php中文网

原创

非公平锁吞吐量更高,因其在lock()和tryAcquire()中直接CAS抢锁,跳过入队、tail更新、waitStatus设置及线程挂起,大幅减少高竞争下的开销;公平锁则必须依赖waitStatus验证排队资格,每步均涉及volatile读、CAS和对象分配,成本显著更高。

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

非公平锁吞吐量更高,根本原因不是“插队”本身,而是它大幅减少了 Node 实例创建、tail 指针 CAS 更新、waitStatus 维护和线程挂起/唤醒的频次——这些操作在高竞争下会快速放大开销。

非公平锁怎么跳过 Node 入队直接抢锁

非公平锁在 lock() 和 tryAcquire() 两个关键入口都执行一次 compareAndSetState(0, 1)。只要 state == 0,就尝试抢占,完全不查同步队列是否为空、也不管 head.next 是谁。

这意味着:

  • 刚释放锁的瞬间,若恰好有线程执行 lock(),大概率直接抢到,根本不会走到 addWaiter()
  • 即使队列里已有多个 Node 处于 SIGNAL 状态,新线程仍可“穿插”成功
  • 整个过程不新建 Node、不更新 tail、不设置前驱 waitStatus = SIGNAL、不调用 LockSupport.park()

公平锁为什么必须依赖 waitStatus 判断排队资格

公平锁的 tryAcquire() 在 state == 0 时,强制调用 hasQueuedPredecessors() ——这个方法本质是检查 head.next 是否存在且其 waitStatus != CANCELLED。

它不是简单“看队列空不空”,而是读取链表结构并验证节点状态的有效性:

  • 如果 head.next 是 CANCELLED 节点,要继续往后找第一个有效 Node
  • 只要找到任意一个有效后继,就说明“有人排在我前面”,必须放弃 CAS、调用 addWaiter() 入队
  • 入队后还要再 CAS 设置前驱的 waitStatus = SIGNAL,才能安全进入 park()

每一步都涉及 volatile 读、CAS、对象分配,比一次 compareAndSetState() 重得多。

Rydberg Agent Node
Rydberg Agent Node

使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r

下载

waitStatus 不只是标记,而是调度决策开关

Node.waitStatus 的值(如 0、SIGNAL、CANCELLED)直接影响线程是否被唤醒、何时被唤醒、甚至是否被跳过。

例如 unparkSuccessor() 唤醒后继时:

  • 必须遍历 next 链表,跳过所有 waitStatus == CANCELLED 的节点
  • 对首个非 CANCELLED 节点,先 CAS 将其 waitStatus 改为 0,再 LockSupport.unpark()
  • 非公平锁在 release() 后若发现 state 已被新线程抢走,连这一步都省了

公平性越强,对 waitStatus 一致性和链表结构完整性的依赖就越紧——一旦发生虚假唤醒或 CANCEL 不彻底,队列就可能卡住或跳过本该唤醒的线程。

实测中 Node 入队率差异直接反映 GC 与上下文切换压力

在 100 线程争抢单许可锁的压测场景下:

  • 非公平锁平均 Node 入队率约 30%,意味着 70% 的请求在线程栈上完成,没触发任何队列逻辑
  • 公平锁接近 95%,几乎每次争抢都新建 Node、更新 tail、设置 waitStatus、挂起线程
  • 这导致公平锁的 GC 压力明显更高,且 CPU 花费大量时间在 park()/unpark() 和上下文切换上,而非实际业务计算

真正容易被忽略的是:waitStatus 的维护不是免费的——它是公平性得以成立的隐式成本,而这个成本在低竞争时几乎不可见,一到高并发就指数级暴露。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Atoms
Atoms Hot

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

WorkBuddy

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

Loomy
Loomy Hot

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

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

豆包大模型

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
java
java

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

10497

2023.06.15

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

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

7622

2023.07.05

java自学难吗
java自学难吗

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

6652

2023.07.31

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

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

1144

2023.08.01

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

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

928

2023.08.02

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

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

1376

2023.08.02

java有什么用
java有什么用

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

2769

2023.08.02

java在线网站
java在线网站

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

20071

2023.08.03

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共102课时 | 10.8万人学习

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

共162课时 | 28.5万人学习

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

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