深入理解Java中的AbstractQueuedSynchronizer(AQS):并发编程的核心组件

news2025/1/8 4:45:38

文章目录

📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。🎥有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。

以梦为马,不负韶华

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

📥博主的人生感悟和目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

CSDN

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。


AQS

AQS的核心思想是共享状态的管理,它通过一个int型的volatile变量来描述同步状态,同时维护一个FIFO队列,用来存放等待线程。在AQS的实现中,同步状态的修改和FIFO队列的维护是通过CAS(Compare-And-Swap)操作实现的。

当一个线程需要获取某个同步资源时,它会先尝试通过CAS操作修改同步状态,如果成功获取锁,则直接返回。

获取锁的方法取决于同步资源的类型。如果是独占资源,那么只有一个线程可以获取锁,其他线程需要等待独占锁释放。此时,获取锁的方法是通过CAS操作修改同步状态,如果成功获取锁,则返回;否则被封装为Node节点,加入到FIFO队列中等待。

如果是共享资源,多个线程可以同时获取锁,这就需要采用读写锁的机制。通过读锁可以实现多个线程同时对同一共享资源进行读操作,而写锁则是独占锁,只允许一个线程进行写操作。获取共享锁的方法是通过尝试通过CAS操作修改同步状态,并判断当前状态是否允许获取共享锁,如果成功获取锁,则返回;否则被封装为Node节点,加入到FIFO队列中等待。

如果CAS操作失败,则说明当前线程没有成功获取锁,它就会被封装为一个Node节点,并加入到FIFO队列的尾部。

如果是独占锁,节点会被加入到一个同步队列中,每个节点都有一个前驱节点和后继节点,通过这些节点连接起来形成一个FIFO队列。加入队列的方法是通过自旋操作,不断尝试将当前节点加入到队列中。如果是共享锁,则会维护两个FIFO队列,一个用来存放读锁的等待线程,另一个用来存放写锁的等待线程。

当同步状态的持有者释放锁时,它会尝试唤醒队列中的第一个线程。被唤醒的线程会再次尝试通过CAS操作获取锁,直到它成功获取锁为止。

在等待队列中,节点会有前驱和后继节点。当一个节点被唤醒并成功获取锁后,它会检查自己的后继节点是否处于等待状态。如果是,当前线程会尝试通过CAS操作获取同步状态,并将后继节点从等待队列中移除。如果获取同步状态的操作失败,说明后继节点已经被其他线程获取了锁,当前线程需要继续等待。否则,当前线程会继续尝试获取锁,如果获取成功,则返回;否则继续封装为节点加入到FIFO队列中等待。

CSDN

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

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

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

相关文章

wait、notify、notifyAll 方法的使用注意事项?

Java全能学习面试指南:https://javaxiaobear.cn 我们主要学习 wait/notify/notifyAll 方法的使用注意事项。 我们主要从三个问题入手: 为什么 wait 方法必须在 synchronized 保护的同步代码中使用?为什么 wait/notify/notifyAll 被定义在 …

基于灰狼算法的无人机航迹规划-附代码

基于灰狼算法的无人机航迹规划 文章目录 基于灰狼算法的无人机航迹规划1.灰狼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用灰狼算法来优化无人机航迹规划。 1.灰狼搜索算法 …

Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式 Python桌面应用之XX学院水卡报表查询系统功能: 连接Oracle数据库,查询XX学院水卡操作总明细报表,汇总数据报表,个人明细报表,进行预览并且支持导出报表 1.总明细报表样式 2.汇总明细样式 3.个人明细…

Proteus仿真--VB上位机程序控制DS1302时钟仿真(Proteus仿真+程序)

本文主要介绍基于51单片机的VB上位机程序控制DS1302时钟仿真设计(完整仿真源文件及代码见文末链接) 简介 硬件电路主要分为单片机主控模块、DS1302模块、LCD1602液晶显示模块以及串口模块 (1)单片机主控模块:单片机选…

Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式,统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置,比如当导入大量图片时,自动设置图片的类型,大小等。Ass…

volatile-读写屏障插入策略

6.2.4 困难内容 JMM就将内存屏障插入策略分为4种规则 读屏障: 写屏障:

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101)

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101) 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc(Multi-Scale,多尺度(预测…

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker,所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager,或 manager 降级为 worke…

软件测试 (用例篇)

前言 上一篇博客讲述的是一次基本的测试过程。 在我们开始做了一段时间基础测试,熟悉了业务之后,往往会分配来写测试用例,并且在日常测试中,有时也需要补充测试用例到现有的案例库中。 在这里我们将回答以下问题 1、测试用例的…

Pytorch深度学习快速入门—LeNet简单介绍(附代码)

一、网络模型结构 LeNet是具有代表性的CNN,在1998年被提出,是进行手写数字识别的网络,是其他深度学习网络模型的基础。如下图所示,它具有连狙的卷积层和池化层,最后经全连接层输出结果。 二、各层参数详解 2.1 INPUT层…

上门预约洗鞋小程序开发;

上门洗鞋小程序服务小程序是一款方便用户与服务提供者进行交流和预约的平台,覆盖多个行业,包括家政清洁、洗衣洗鞋,维修服务等,满足用户在生活中各种需求的上门服务。用户可以在小程序中选择服务项目、预约时间,服务人…

JDK的配置及运行过程

文章目录 介绍JDK编译运行过程为什么要配置环境变量配置环境变量的作用 配置JDK验证ps: 介绍JDK 【面试题】JDK、JRE、JVM之间的关系? JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译…

Mysql如何理解Sql语句?MySql分析器

1. 什么是 MySQL 分析器? MySQL 分析器是 MySQL 数据库系统中的一个关键组件,它负责解析 SQL 查询语句,确定如何执行这些查询,并生成查询执行计划。分析器将 SQL 语句转换为内部数据结构,以便 MySQL 可以理解和执行查询请求。 …

数据集特征预处理

1、什么是特征预处理 1.1、什么是特征预处理 scikit-learn的解释 provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators. 翻译过来:通…

VRPTW(MATLAB):斑马优化算法ZOA求解带时间窗的车辆路径问题VRPTW(提供参考文献及MATLAB代码)

一、VRPTW简介 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)是车辆路径问题(VRP)的一种拓展类型。VRPTW一般指具有容量约束的车辆在客户指定的时间内提供配送或取货服务,在物流领域应用广泛,具有重要的实际意义。VRPTW常…

嵌入式系统设计中时钟抖动的基础

嵌入式开发时钟抖动是时钟沿偏离其理想位置的偏差。了解时钟抖动在应用中非常重要,因为它在系统的时序预算中起着关键作用。它有助于嵌入式开发工程师了解系统时序裕度。 随着系统数据速率的提高,时序抖动已成为系统设计中的关键,因为在某些…

[资源推荐]看到一篇关于agent的好文章

链接在此:Chat 向左,Agent 向右 - 李博杰的文章 - 知乎 https://zhuanlan.zhihu.com/p/662704254当时在电脑知乎上看了一半,打开手机微信公众号,就给我推了同样的,这推荐算法😥今年关于大模型的想法经历了几…

短视频矩阵系统源码搭建/技术应用开发/源头独立搭建

短视频剪辑矩阵系统开发源码----源头搭建 矩阵系统源码主要有三种框架:Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架,提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架,用于将数…

功能基础篇8——图形用户界面

图形用户界面 Graphics User Interface,GUI,图形用户界面 Ubuntu GUI Command Line Interface,CLI,命令行界面 Centos CLI tkinter GUI,Python标准库 from tkinter import ttk, Tkroot Tk() frm ttk.Frame(…

网络工程师最强入职指南

大家好,我是老杨。 秋招即将进入尾声,各位都找到心仪的工作了吗? 今年的春秋招的热度好像不是很高,而且很多网工都是在“全年找工作”的状态里持续着,字里行间无不透露出对行业和自身的焦虑。 毕竟“今年是未来10年…