深入理解 AbstractQueuedSynchronizer(AQS):构建高性能同步器的基石 - 指南

news/2025/10/14 17:34:32/文章来源:https://www.cnblogs.com/lxjshuju/p/19141646

AbstractQueuedSynchronizer(简称 AQS)是 Java 并发包(java.util.concurrent)中最核心的基础类之一,几乎所有自定义的同步器(如 ReentrantLockCountDownLatchSemaphoreFutureTask 等)都直接或间接地基于 AQS 实现。

本文将深入探讨 AQS 的核心设计思想、内部数据结构、关键方法实现、以及它背后的并发控制模型。


一、AQS 的核心设计思想

AQS 提供了一个 队列式的、基于状态的同步框架,它的设计思想非常明确:

基本模型:

通过维护一个 volatile 的 state 变量来表示同步状态,并用一个 FIFO 队列管理等待线程。

具体来说,它实现了两种锁的语义:

开发者通过继承 AQS 并重写其 tryAcquire / tryRelease 等方法来实现自定义的同步逻辑,而不需要关心线程挂起/唤醒的底层细节。


️ 二、AQS 的关键内部结构

1. state 变量(同步状态)

private volatile int state;

这是 AQS 的核心状态变量,通常用来表示资源是否可用、计数器大小等。子类通过 getState() / setState() / compareAndSetState() 来访问和修改它。


2. CLH 队列(等待队列)

AQS 使用一种变种的 CLH(Craig, Landin, and Hagersten)锁队列 来维护所有正在等待获取锁的线程。

static final class Node {
volatile Node prev;
volatile Node next;
volatile Thread thread;
volatile int waitStatus;
}

常见的 waitStatus 值:

  • 0:默认状态
  • SIGNAL (-1):后继节点等待唤醒
  • CANCELLED (1):线程取消等待
  • CONDITION (-2):表示在 condition 上等待
  • PROPAGATE (-3):共享模式传播

队列头尾指针:

private transient volatile Node head;
private transient volatile Node tail;

AQS 通过 enq()acquireQueued() 等方法管理队列入队/出队与线程阻塞/唤醒的逻辑。


⚙️ 三、核心方法详解

1. acquire(int arg):独占模式获取

public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}

流程如下:

  • 首先尝试获取锁(调用子类实现的 tryAcquire());
  • 获取失败则将当前线程包装成 Node 并加入等待队列;
  • 在队列中自旋等待,并最终阻塞(LockSupport.park());
  • 直到被前驱唤醒并重新竞争资源。

2. release(int arg):独占模式释放

public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
  • 调用子类的 tryRelease() 释放资源;
  • 如果成功,唤醒等待队列中的下一个线程。

3. acquireShared(int arg) / releaseShared(int arg)

共享模式下的获取和释放,允许多个线程同时访问资源(如信号量)。

public final void acquireShared(int arg) {
if (tryAcquireShared(arg) < 0)
doAcquireShared(arg);
}

四、自定义同步器的三大步骤

要实现一个自定义同步器,一般遵循以下步骤:

1. 继承 AbstractQueuedSynchronizer

class MyLock extends AbstractQueuedSynchronizer {
...
}

2. 实现同步逻辑(重写关键方法)

protected boolean tryAcquire(int arg) {
// 例如实现不可重入独占锁
return compareAndSetState(0, 1);
}
protected boolean tryRelease(int arg) {
setState(0);
return true;
}

3. 暴露锁 API 给外部调用

public void lock() {
acquire(1);
}
public void unlock() {
release(1);
}

五、AQS 的典型应用场景

类名功能AQS 模式
ReentrantLock可重入独占锁独占
Semaphore信号量共享
CountDownLatch倒计时器共享
ReadWriteLock读写锁独占 + 共享
FutureTask任务状态管理独占

这些类都封装了 AQS 提供的同步能力,让我们得以用更高层的 API 进行线程协作。


六、深入理解:CLH 队列与线程挂起/唤醒

✴️ 挂起线程:LockSupport.park()

当线程获取锁失败,就会调用 LockSupport.park(this) 挂起自己。

✴️ 唤醒线程:LockSupport.unpark(thread)

释放锁后,会唤醒队列中的下一个节点对应的线程。

这是一种 显式挂起-唤醒机制,相比传统 wait/notify 更加灵活和安全,不依赖对象 monitor。


七、AQS 存在的问题和挑战

  • 非公平锁可能导致线程“饿死”
  • 锁竞争激烈时,自旋+挂起开销大
  • 调试困难,出错后难以定位问题源头
  • 死锁风险高,一旦 tryAcquire 实现不当容易出问题;

因此,在使用 AQS 时,强烈建议封装为高层 API 使用,不要轻易手写同步器,除非非常熟悉。


✅ 总结

特性描述
模型基于状态的同步器
队列CLH 队列实现等待线程排队
支持独占与共享两种模式
控制点子类重写 tryAcquire / tryRelease 等控制同步行为
应用ReentrantLock、Semaphore、CountDownLatch、FutureTask 等

推荐阅读与资料

  • 《Java 并发编程实战》(Java Concurrency in Practice)
  • Doug Lea 的 AQS 原始设计文档
  • JDK 源码中的 AbstractQueuedSynchronizer.java 注释
  • 博客:Martin Fowler 的并发模式分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年清洗机厂家最新推荐:高压清洗机、超声波清洗机等多类型设备企业品牌权威榜单,帮企业高效筛选优质清洗设备

随着工业生产对设备洁净度与生产效率要求不断提升,清洗机市场需求日益旺盛,但市场品牌繁杂、产品质量参差不齐的问题也愈发凸显。许多企业在选购时,常因缺乏专业信息支撑,难以辨别设备技术是否适配自身行业、质量是…

AVAssetExportSession 为什么比 videotoolbox 处理视频快

https://www.doubao.com/thread/wdad52d2858751bac判断力是一个人最重要的能力

springboot线上问题websocket、rabbitmq失效

问题出现,之前没问题,发过版后突然不行了让后一直不消费,生产者正常,websocket也连接不上最后确认是开起了懒加载,导致初始化失效了,出现连锁反应

从零开始:用C#开发的海量文件内容秒搜神器TDSContent——免费开源高效办公必备!

从零开始:用C#开发的海量文件内容秒搜神器TDSContent——免费开源高效办公必备!从零开始:用C#开发的海量文件内容秒搜神器TDSContent——免费开源高效办公必备! 还在为全文搜索烦恼吗?是否被收费软件的糟糕体验困扰?…

centos 7.9 安装单机版k8s

我这里提前安装好了 docker ,直接着手安装k8s[root@zjk ~]# docker -v Docker version 26.1.4, build 5650f9b1、关闭防火墙、selinux(减少不必要的麻烦)、交换区(防止k8s对pod内存监控幻觉)systemctl stop firew…

隐藏继承成员什么时候用到

“只有在‘故意不让父类成员参与多态’,但又不想改父类签名时,才用 new 隐藏继承成员。”一、先分清 表格 复制关键字目的运行时效果override 扩展/替换父类实现 动态绑定——真实类型决定方法new 彻底隐藏父类成员 …

2025 旋转蒸发仪选型指南:适配科研与生产需求的优质厂家 TOP5 推荐

2025 旋转蒸发仪选型指南:适配科研与生产需求的优质厂家 TOP5 推荐在精细化工提纯、生物医药溶剂回收、高校科研样品预处理等场景中,旋转蒸发仪的控温精度、真空适配性及运行稳定性,直接决定实验效率与产物纯度。面…

今天被公司告知不续签合同了,我被优化了 哈哈哈

沒什么别的事儿,今天被公司告知不续签合同了,我被优化了 哈哈哈, 记录一下

移动终端安全:实验2-创建自签名证书对APP签名 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年混合机厂家最新推荐排行榜:强力混合机 / 倾斜式混合机 / 耐火材料混合机 / 锂电池材料混合机 / 球团强力混合机优质厂家推荐

当前锂电池、耐火材料、陶瓷、化工等行业飞速发展,对混合机的需求愈发多元,不仅要求设备混合均匀度高,还需适配不同物料特性与生产场景。但行业内混合机品牌繁杂,产品质量参差不齐,部分设备存在混合死角、能耗高、…

Oracle OCM 认证的定位与价值

对于刚接触数据库的“小白”来说,Oracle OCM认证是个非常陌生的词,”最高级认证“、”认证大师“听起来像一座遥不可及的高山。别担心,OCM虽然难,但”难啃的骨头才香“。 OCM认证,全称为Oracle Certified Master(…

2025 优质防爆接线盒/防爆穿线盒/防爆接电箱厂家推荐榜:安全与专业兼具的行业之选

在石油、化工、矿山等易燃易爆环境中,防爆接线盒作为电气系统的 "安全卫士",其质量与性能直接关系到生产安全。基于产品合规性、市场应用反馈及综合服务能力,本文梳理出五家值得关注的防爆接线盒制造商,…

Microsoft Purview实现数据泄露概率降低30%的技术解析

根据Forrester研究报告,微软Purview统一数据安全平台通过精细化数据防丢失策略、自动化合规审计和集中式信息治理,帮助企业实现数据泄露概率降低30%,调查时间减少75%,并节省近50万美元的遗留成本。Microsoft Purvi…

Day13-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\exception

异常EXCEPTION 检查性异常 用户错误或问题引起的异常 运行时异常 运行时异常可以被程序员发现 错误ERROR 错误不是异常,而是脱离程序员控制的问题,比如栈溢出 异常处理框架 java可以吧异常当作对象来处理,并定义一个…

2025 值得关注的除锈剂厂家企业推荐榜单,覆盖多场景需求

在工业维护、汽车养护、设备保养等多个领域,除锈剂作为基础防护产品发挥着关键作用。市面上的除锈剂企业各具特色,有的深耕技术研发,有的侧重场景适配,有的凭借口碑站稳市场。以下结合企业技术实力、产品适配性及行…

Day3整形输入

#include<stdio.h>int main(){int a;//通过键盘输入赋值//&运算符,表示取地址运算符scanf("%d",&a);printf("%d\n",a);return 0; }

2025优质电缆/防火/模压/瓦楞/大跨距/热镀锌/热浸锌/不锈钢/光伏/铝合金/锌铝镁桥架厂家推荐:五家实力企业的技术与服务特色解析

在工业电力传输与布线系统中,电缆桥架作为关键基础设施,其品质直接影响工程安全性与运维效率。经过市场调研与行业口碑梳理,以下五家桥架厂家凭借各自技术优势与服务能力脱颖而出,涵盖不同规模与特色定位,为各类工…

2025 领域优质石油/电厂/钢铁厂/化工/消防/船舶/住宅/管道/隧道/地铁电伴热带厂家推荐榜单,工业与民用场景全覆盖

在工业保温、建筑采暖、管道防冻等领域,电伴热带作为核心加热设备,其产品性能与服务质量直接影响项目安全与效率。经过对行业技术实力、项目应用案例及市场口碑的综合梳理,以下为大家推荐五家各有优势的电伴热带厂家…

高效驱动 IC 设计的关键 - RTL 合成

在现代数字设计中,RTL 合成(Register-Transfer Level Synthesis)是将抽象描述转化为具体实现的关键一环。它将使用 Verilog 或 VHDL 编写的行为级(behavioral)逻辑,转换为基于门电路的结构表示(gate-level netl…

springboot实现支付宝支付

​ maven引入<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.7.4.AL</version></dependency>配置 ​package c…