深入理解AQS:Java并发编程中的核心组件
目录
- AQS简介
- AQS的设计思路
- AQS的核心组成部分
- 状态(State)
- 同步队列(Sync Queue)
- 条件队列(Condition Queue)
- AQS的内部实现
- 节点(Node)
- 锁的获取与释放
- 独占锁
- 共享锁
- 条件变量
- AQS的应用案例
- ReentrantLock
- CountDownLatch
- Semaphore
- 总结
- 参考文献
AQS简介
AbstractQueuedSynchronizer(AQS)是Java并发包(java.util.concurrent)中用于构建锁和同步器的基础框架。AQS通过一个FIFO(First In First Out)等待队列来管理获取锁的线程,提供了独占模式和共享模式两种同步方式。
AQS的设计目标是简化开发人员在实现自定义同步器时的复杂性。通过继承AQS并实现其抽象方法,开发人员可以轻松创建功能强大的同步器。
AQS的设计思路
AQS的设计基于两个关键思想:
- 状态管理:使用一个volatile类型的整数变量来表示同步状态,通过CAS操作(Compare And Swap)来更新状态。
- 队列管理:使用一个FIFO队列来管理等待获取锁的线程。
这种设计方式使得AQS既能保证线程的安全性,又能提供高效的性能。
AQS的核心组成部分
状态(State)
AQS通过一个整数变量来表示同步状态。这个变量可以表示不同的含义,例如:
- 对于独占锁,0表示未锁定,1表示已锁定。
- 对于共享锁,可以表示当前可用的资源数量。
状态变量通过volatile关键字修饰,确保其在多个线程之间的可见性。
同步队列(Sync Queue)
同步队列是一个FIFO队列,当线程无法获取锁时,它们会被加入到该队列中。队列中的每个节点都表示一个等待的线程。
条件队列(Condition Queue)
条件队列用于管理那些调用了条件变量的await方法后进入等待状态的线程。条件队列与同步队列类似,都是FIFO队列。
AQS的内部实现
节点(Node)
AQS的队列是由Node节点组成的。每个Node节点包含以下几个重要字段:
- thread:表示当前节点所代表的线程。
- nextWaiter:用于条件队列,指向下一个等待的节点。
- waitStatus:表示节点的等待状态。
Node节点的等待状态包括:
- CANCELLED:节点已取消。
- SIGNAL:节点需要唤醒。
- CONDITION:节点在条件队列中等待。
- PROPAGATE:下一个acquireShared需要无条件传播。
锁的获取与释放
独占锁
独占锁意味着一次只能有一个线程持有锁。独占锁的获取与释放通过以下方法实现:
acquire(int arg)
:尝试获取独占锁,如果失败则加入同步队列。release(int arg)
:释放独占锁,成功后唤醒同步队列中的下一个节点。
独占锁的获取逻辑主要通过tryAcquire
方法实现,开发人员需要重写该方法来定义锁的获取规则。
共享锁
共享锁允许多个线程同时持有锁。共享锁的获取与释放通过以下方法实现:
acquireShared(int arg)
:尝试获取共享锁,如果失败则加入同步队列。releaseShared(int arg)
:释放共享锁,成功后唤醒同步队列中的下一个节点。
共享锁的获取逻辑主要通过tryAcquireShared
方法实现,开发人员需要重写该方法来定义锁的获取规则。
条件变量
AQS还提供了条件变量的支持,通过ConditionObject
类来实现。条件变量的核心方法包括:
await()
:当前线程进入等待状态,加入条件队列。signal()
:唤醒条件队列中的一个节点。signalAll()
:唤醒条件队列中的所有节点。
条件变量的实现依赖于Node节点的CONDITION状态。当线程调用await
方法时,节点会被加入到条件队列,并将其状态设置为CONDITION。
AQS的应用案例
ReentrantLock
ReentrantLock是一种可重入的独占锁,它通过继承AQS并实现其抽象方法来实现锁的功能。主要包括以下几个步骤:
- 实现
tryAcquire
方法:定义独占锁的获取逻辑。 - 实现
tryRelease
方法:定义独占锁的释放逻辑。 - 使用同步队列来管理等待的线程。
CountDownLatch
CountDownLatch是一种同步工具类,它允许一个或多个线程等待直到其他线程执行完毕。它也基于AQS实现,主要包括以下步骤:
- 实现
tryAcquireShared
方法:定义共享锁的获取逻辑。 - 实现
tryReleaseShared
方法:定义共享锁的释放逻辑。 - 使用一个计数器来表示需要等待的线程数量。
Semaphore
Semaphore是一种计数信号量,它允许多个线程访问一定数量的共享资源。它的实现步骤与CountDownLatch类似:
- 实现
tryAcquireShared
方法:定义共享锁的获取逻辑。 - 实现
tryReleaseShared
方法:定义共享锁的释放逻辑。
总结
AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,为实现锁和其他同步器提供了基础框架。通过管理同步状态和等待队列,AQS能够高效地处理多线程并发问题。开发人员可以通过继承AQS并实现其抽象方法,轻松创建自定义的同步器。
本文详细介绍了AQS的概念、设计思路、核心组成部分及其内部实现机制,并通过ReentrantLock、CountDownLatch和Semaphore的案例展示了AQS在实际应用中的使用方法。理解AQS的工作原理对于掌握Java并发编程至关重要。
参考文献
- Doug Lea, “A Scalable Synchronization Mechanism for Java”
- Java Concurrency in Practice
- Java官方文档
- Java并发编程的艺术
通过本文的详细讲解,希望读者能够深入理解AQS的工作原理,并能够在实际编程中灵活运用这一强大的工具。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
深入理解AQS:Java并发编程中的核心组件
目录 AQS简介AQS的设计思路AQS的核心组成部分 状态(State)同步队列(Sync Queue)条件队列(Condition Queue) AQS的内部实现 节点(Node)锁的获取与释放 独占锁共享锁 条件变量 AQS的应…...
![](https://img-blog.csdnimg.cn/direct/cd118c0f23db453296124bc785dd6072.png)
集合进阶:List集合
一.List集合的特有方法 1.Collection的方法List都继承了 2.List集合因为有索引,所以多了很多索引操作的方法。 3.add // 1.创建一个集合List<String> list new ArrayList<>(); // 2.添加元素list.add("aaa");list.add("bbb"…...
![](https://img-blog.csdnimg.cn/direct/82a3c0d0ebe94ceebcf06b199dcb795b.png)
el-table表头修改文字或者背景颜色,通过header-row-style设置样式
方式一 <el-table :header-cell-style"{text-align: center}" />方式二 <template><el-table :header-cell-style"tableHeaderColor" /> </template> <script> export default {methods: {tableHeaderColor ({row, column…...
![](https://img-blog.csdnimg.cn/direct/6d8d151cded2438ca00b66aecf76c38e.png)
web前端-CSS
CSS CSS概述: CSS是Cascading Style Sheets(级联样式表),是一种样式表语言,用于控制网页布局,外观(比如背景图片,图片高度,文本颜色,文本字体,高级定位等等) 可将页面的内容与样式分离开,样式放于单独的.css文件或者HTML某处 CSS是网页样式,HTML是网页…...
![](https://www.ngui.cc/images/no-images.jpg)
u8g2 使用IIC驱动uc1617 lcd 字符显示只显示上半部分,不显示下半部
使用u8g2 使用硬件iic驱动某些page为4个字节 带灰度的lcd显示屏幕的时候有时候只显示上半部,下半部不显示,例如uc1617等。 原因: 以uc1617为例,链接https://github.com/olikraus/u8g2/blob/master/csrc/u8x8_d_uc1617.c 在u8x8_d_uc1617_common方法中的case U8X8_MSG_DI…...
![](https://img-blog.csdnimg.cn/direct/485ad4c1278645a7abd5b9241bbb7a1e.png)
单片机第五季-第八课:STM32CubeMx和FreeRTOS
1,FreeRTOS背景介绍 RTOS简介: 实时操作系统,本用于追求实时性的嵌入式系统,典型:ucos/uclinux/vxworks; 特点:中断响应快、一般可嵌套中断、使用实地址、多任务; (实…...
![](https://img-blog.csdnimg.cn/direct/2dd2d00d70504936a820b14fc8e1cf97.png)
【Linux】进程控制1——进程创建和进程终止
1.进程创建 1.1.再谈fork 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include <unistd.h> pid_t fork(void);//pid_t为整形 返回值:子进程中的fork()返回0ÿ…...
![](https://img-blog.csdnimg.cn/direct/220a8852f6dc4a6ba5dc2f73c24a4902.png)
计算机图形学入门16:曲线
1.曲线 曲线(Curves)在图形学中应用非常广泛,比如:相机的拍摄路径、物体的移动路径、动画曲线、矢量字体等。如下图所示,是使用曲线到矢量字体的应用,通过移动一些控制点来改变字体。 2.贝塞尔曲线 2.1 贝…...
![](https://img-blog.csdnimg.cn/7cca864db76b46f1ba479780b00752d9.png)
【Ruby基础01】windows和termux中搭建Ruby开发环境
windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn,安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件,按照里面的流程…...
![](https://www.ngui.cc/images/no-images.jpg)
2406c++,iguana动态反射
原文 iguana是一个基于编译期反射的序化库,支持从结构序化到不同数据格式. iguana可序化一个C结构到json,xml,yaml和protobuf格式.这都是通过编译期反射实现的. 现在iguana也支持了动态反射,主要特征: 1,通过对象名创建对象实例 2,取对象所有字段名 3,根据字段名取字段值 4,根…...
![](https://www.ngui.cc/images/no-images.jpg)
干货分享——AB站帮你解决独立站收款难题
目前,国内已经有抖音、拼多多和淘宝平台推出“仅退款”售后服务,无疑是加剧了原本就在疯狂打价格战的国内电商的严峻现状,使得商家不得不担心被顾客“薅羊毛”。在国内电商环境严重“内卷”的情况下,拓宽海外市场不失为一大妙计。…...
![](https://www.ngui.cc/images/no-images.jpg)
C++继承与派生
1.基本知识 类的继承是新类从已有类那里获得特性,从已有的类产生新类的过程称为类的派生; 已有类称为基类或父类,派生出的新类则称为派生类或子类; 继承的功能: (1)使得基类与派生类之间建立…...
![](https://img-blog.csdnimg.cn/direct/103614c14c1046c4a9e9819f7e112c7c.jpeg)
Survival Animations
一套生存游戏的动画集,包括采集、建造、捕鱼、剥皮/鞣制、篝火等更多内容。 总动画数:89 建造/制作 30 篝火 28 饮水 3 水壶 3 觅食 2 治疗 3 空闲 1 原始捕鱼 7 剥皮 1 矛捕鱼 4 伐木 5 下载:Unity资源商店链接资源下载链接 效果图:...
![](https://www.ngui.cc/images/no-images.jpg)
Cargo 教程
Cargo 教程 1. 引言 Cargo 是 Rust 编程语言的包管理器和构建工具。它为 Rust 项目提供了依赖管理、编译和打包等功能。本教程将详细介绍 Cargo 的基本用法,帮助您快速上手 Rust 项目开发。 2. 安装 Cargo 在开始使用 Cargo 之前,您需要确保已经安装了 Rust 编程语言。Ru…...
![](https://img-blog.csdnimg.cn/direct/59951089d4584d91aa5f63d68292f63e.png)
linux中“PXE高效批量装机”
在大规模的 Linux 应用环境中,如 Web 群集、分布式计算等,服务器往往并不配备光驱设备,在这种情况下,如何为数十乃至上百台服务器裸机快速安装系统呢?传统的 USB光驱、移动硬盘等安装方法显然已经难以满足需求。 PXE …...
![](https://img-blog.csdnimg.cn/direct/02dfb451f0d346d79877d96abfb87670.png)
emm, ComfyUI的作者从Stability.AI离职了
🍖背景 今天在更新ComfyUI的过程中,看到Manager中有这样一段描述: 嗯?做了新的官方网站?然后开始新篇章? 难道说ComfyUI的作者从Stability.AI离职了? 赶紧点开链接看了下,emm&…...
![](https://img-blog.csdnimg.cn/direct/bd943775a0d849dbae2046c1247e4e84.png)
Redis-五种数据结构之列表(ziplist、quicklist)
列表 文章目录 列表压缩列表-ziplistziplist 定义级联更新 快速列表-quicklistquicklistNode 定义quicklist 定义quicklist常用操作其他操作quicklist 相对于普通链表优点quick应用场景在redis 中使用quicklist 列表数据类型可以存储一组按插入顺序排序的字符串,他很…...
![](https://img-blog.csdnimg.cn/direct/ae81db65077b4bb99e63473277ec178f.png)
记一次全设备通杀未授权RCE的挖掘经历
想来上一次挖洞还在一年前的大一下,然后就一直在忙活写论文,感觉挺枯燥的(可能是自己不太适合弄学术吧QAQ),所以年初1~2月的时候,有空的时候就又会挖一挖国内外各大知名厂商的设备,拿了几份思科…...
![](https://img-blog.csdnimg.cn/direct/89f230c8f6d04e1997420940fba056a3.png)
【数据库编程-SQLite3(一)】sqlite3数据库在Windows下的配置及测试
学习分析 1、资源准备2、环境配置2.1、将资源包下载解压缩保存。2.2、在QT中创建工程,配置环境 3、测试配置3.1、 sqlite3_open函数3.2、sqlite3_close函数3.3、代码测试 1、资源准备 资源包 2、环境配置 2.1、将资源包下载解压缩保存。 解压缩得到以下文件 2.2、在QT中创建…...
![](https://img-blog.csdnimg.cn/direct/cf86a8e35c8d40e08044da9f112071c7.png)
YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone
1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…...
![](https://www.ngui.cc/images/no-images.jpg)
C++ 迷宫问题
描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走…...
![](https://www.ngui.cc/images/no-images.jpg)
【Linux】Linux文件系统中主要文件夹列举_作用说明
在Linux系统中,文件夹(或称为目录)的组织结构是系统功能和用户数据的重要组成部分。以下是Linux系统中一些主要文件夹的列举及其作用说明: / (根目录): 是Linux文件系统的起点。通常只包含其他目录,不建议直接在其中存…...
![](https://img-blog.csdnimg.cn/direct/65e6d218d37b4a3ca456db30ee7b9113.png#pic_center)
移植案例与原理 - HDF驱动框架-驱动配置(1)
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。应该,类似Linux DTS(Device Tree Source)设备树。 HC-GEN(HDF Configuration Generator)是…...
![](https://img-blog.csdnimg.cn/direct/7ca2491519c84665a5de51baa17bd097.png)
坚持刷题|反转链表
文章目录 题目思考实现1. 迭代方式实现链表翻转2. 递归方式实现链表翻转 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天继续链表:反转链表 题目 LCR 024. 反转链表 思考 翻转链表是一个常见的算法问题&a…...
![](https://img-blog.csdnimg.cn/direct/887e4e956e8447c4918abed3f080081d.png)
升级和维护老旧LabVIEW程序
在升级老旧LabVIEW程序至64位环境时,需要解决兼容性、性能和稳定性等问题。本文从软件升级、硬件兼容性、程序优化、故障修复等多个角度详细分析。具体包括64位迁移注意事项、修复页面跳转崩溃、解决关闭程序后残留进程的问题,确保程序在新环境中的平稳运…...
![](https://www.ngui.cc/images/no-images.jpg)
sqlite数据库整体迁移进mysql整个流程并解决中文异常问题
咨询【QQ】 sqlite轻量数据还行,随着数据量增大,不得不迁移进mysql 首先 电脑执行 sqlite3 db.sqlite3 .dump > dump.sql 会把整个sqlite的数据导出进 dump.sql中 紧接着我们把sqlite的sql转换成mysql的sql语句,因为mysql语句和 sq…...
![](https://img-blog.csdnimg.cn/direct/bf098702388d4fcf971dd552117ab72a.png)
Hadoop3:MapReduce中的Partition原理及自定义Partition
一、默认Partition分区配置 以WC案例来进行验证。 1、设置setNumReduceTasks 修改的代码 这行代码,确定了reduceTask的数量,也确定了分区逻辑 在mapper文件中,打上断点 计算分区的代码 这里会对每一个kv进行计算,然后&#…...
![](https://img-blog.csdnimg.cn/direct/fe5dd2492fe342bd9b5fa850b5ca14e5.png)
就因为没在大屏项目加全屏按钮,早上在地铁挨了领导一顿骂
“嗯嗯”,“嗯嗯”,“那产品也没说加呀”,“按F11不行吗?”,“嗯嗯”,“好的”。 早上在4号线上,我正坐在地铁里,边上站着的妹子,我看他背着双肩包,打着电话…...
![](https://img-blog.csdnimg.cn/direct/591239417db740f79fe643e9ee5c5678.png)
STM32学习记录(八)————定时器输出PWM及舵机的控制
文章目录 前言一、PWM1.工作原理2.内部运作机制3. PWM工作模式4.PWM结构体及库函数 二、PWM控制舵机 前言 一个学习STM32的小白~ 有错误评论区或私信指出提示:以下是本篇文章正文内容,下面案例可供参考 一、PWM 1.工作原理 以向上计数为例࿰…...
![](https://img-blog.csdnimg.cn/direct/172e258ae79840fbb625ec53280f3065.png)
Vue CLI,Vue Router,Vuex
前言 Vue CLI、Vue Router 和 Vuex 都是 Vue.js 生态系统中的重要组成部分,它们在构建 Vue 应用程序时扮演着关键角色。 Vue CLI Vue CLI 介绍 Vue CLI 是 Vue.js 的官方命令行工具,用于快速搭建 Vue.js 项目。它提供了一个图形界面(通过…...
![](/images/no-images.jpg)
平湖市住房和城乡规划建设局网站/关键词优化排名第一
在 Windows Internet Explorer 9 和更早的版本中,每个网页中最多只能有 31 个样式表。而且,对于使用 import 规则关联的样式表,最多只能进行四级嵌套。 在 Internet Explorer 10(以及使用 JavaScript 的 Windows 应用商店应用&…...
![](/images/no-images.jpg)
网页上做网会员网站备案怎么写/品牌营销咨询公司
今天想用ajax和cookie做个自动登录,结果出现很多错误,特在此记录下 一开始我没用cookie是这样的 <input id"log-name" type"text" name"username" placeholder"请输入用户名" οnfοcus"this.placeho…...
![](/images/no-images.jpg)
旅游网站建设与翻译/google搜索引擎
UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重要的东西,因为几乎所有的大型UNIX项目的普通贡献者,都是通过 Patch来提交代码的。作为最重要的开源项目之一,Linux࿰…...
做企业网站报价/学电脑办公软件培训班
2019独角兽企业重金招聘Python工程师标准>>> 问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题。 下面可以看一张图,是客户端向服务端发送包&…...
![](/images/no-images.jpg)
网站建设多少钱信息/智能建站网站模板
微信小程序中的空格怎么打 文章目录微信小程序中的空格怎么打怎么打呢?解决怎么打呢? 微信小程序中的多个空格怎么打?  不行。 解决 复 制 吧 前面每个字之间都有一个空白字符,🐮space...
![](/images/no-images.jpg)
企业网站排名/seo咨询解决方案
使用情景区别 listenTo用于监听自身意外的对象 on用于监听自身 listenTo和on中的回调函数里的this的区别 listener.listenTo(object, eventName, function(){//此处的this指向listener})object.on(eventName, function(){//此处的this指向object})object.on(eventName, functio…...