AQS的acquire(int arg) 方法底层源码

news/2025/2/28 1:25:39/文章来源:https://www.cnblogs.com/jock766/p/18742424

一、定义

acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态。如果当前线程无法获取同步状态,则将其加入等待队列并阻塞,直到成功获取同步状态或被中断


1、acquire(int arg) 方法的作用

  • 功能:尝试获取同步状态(独占模式),如果失败则将当前线程加入等待队列并阻塞,直到成功获取同步状态或被中断

  • 返回值:无返回值,但可能会抛出 InterruptedException


二、acquire(int arg) 方法的源码

以下是 acquire(int arg) 方法的源码及其详细解析:


1、tryAcquire(int arg) 方法

  • 作用:尝试获取同步状态,由子类实现。

  • 返回值:如果成功获取同步状态,则返回 true;否则返回 false。


2、addWaiter(Node mode) 方法

  • 作用:将当前线程封装为 Node 并加入等待队列。

  • 参数:mode:节点模式,Node.EXCLUSIVE 表示独占模式,Node.SHARED 表示共享模式


3、enq(Node node) 方法

  • 作用:将节点加入队列,如果队列为空则初始化队列。

  • 源码:


4、acquireQueued(Node node, int arg) 方法

  • 作用:在队列中自旋或阻塞,直到成功获取同步状态。

  • 返回值:如果线程在等待过程中被中断,则返回 true;否则返回 false。


5、shouldParkAfterFailedAcquire(Node pred, Node node) 方法

  • 作用:检查是否需要阻塞当前线程,若当前线程为首节点的线程不对该线程进行阻塞,否则进行阻塞。

  • 返回值:如果需要阻塞,则返回 true;否则返回 false。

  • 源码:


6、parkAndCheckInterrupt() 方法

  • 作用:阻塞当前线程并检查是否被中断。

  • 返回值:如果线程被中断,则返回 true;否则返回 false。

  • 源码:


7、selfInterrupt() 方法

  • 作用:如果线程在等待过程中被中断,则重新设置中断标志。

  • 源码:


三、定义

acquire(int arg) 方法的执行流程:


1、调用 tryAcquire(int) 尝试获取同步状态。


2、如果成功,则直接返回。


3、如果失败,则调用 addWaiter(Node) 将当前线程封装为 Node 并加入等待队列。


4、调用 acquireQueued(Node, int) 在队列中自旋或阻塞,直到成功获取同步状态。


5、如果线程在等待过程中被中断,则调用 selfInterrupt() 重新设置中断标志。


四、总结

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

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

相关文章

【钓鱼邮件】春节复工近期常见的钓鱼邮件

本期主要分享2025年2月常见的钓鱼邮件样本,特别提醒广大用户在春节复工高峰期加强安全防范。 补贴类钓鱼邮件 春节之后,五险一金补贴、年终奖补贴相关的钓鱼邮件依旧频发。钓鱼手法也有所提升,攻击者通常将通知内容放到附件中,并且对附件设置访问密码,试图绕过反垃圾系统检…

HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍

title: HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐 date: 2025/2/28 updated: 2025/2/28 author: cmdragon excerpt: 🏭 本文作为系列终章,通过物流管理系统的案例,揭秘API开发的完整流程。你将掌握: 深度解读28个HTTP协议进阶特性(ETag/CO…

第一周实验:二次开发

来源 来自大一舍友C++大作业。该项目模拟了一个图书管理系统,涉及到用户对于书籍的查看、借阅与归还,管理员对于书籍相关信息的增删改查。 运行环境+运行结果的截图 运行环境:Windows 11 + Visual Studio 2022main.cpp #include<Windows.h> #include "Account.h&…

学习笔记之day02 Linux-基础篇-系统安装

​1、操作系统简介操作系统:人与计算机硬件交互的中介Linux:内核+Shell +扩展软件Windows:内核+explorer.exe+软件类比法:计算机硬件 -- 内核 == 蛋黄 / Shell == 蛋清 / 外围应用程序 == 蛋壳常见的操作系统:Windows、Linux、DOS、UnixLinux操作系统开放源代码、可以自由…

绝缘电阻测试仪科普

什么是绝缘电阻绝缘电阻是指两个绝缘介质间的电阻,当另一端安装有电压源时,绝缘介质内电荷不能流动,因而受电压源作用,在另一端产生电势差,形成电阻抵消电压势差而不致使电荷漏出。一般情况下,绝缘电阻越大,电气设备的安全性就越好,缺陷率也越低。 为什么测量绝缘电阻绝…

【CodeForces训练记录】Educational Codeforces Round 175 (Rated for Div. 2)

训练情况赛后反思 CD连续卡题,D题树上层序遍历+加法原理,鉴定为基本的图论数据结构没学好 A题 直接打表,对于 i%3 = i%5 的情况,我们发现有三个一组,三个一组连续的数,每组第一个数之间差 15,所以我们 / 15 * 3 先把整组的数量算出来,再求是组内第几个,就能得到答案了…

软工五问

这个作业属于哪个课程 课程链接这个作业要求在哪里 作业要求这个作业的目标 学习使用markdown, 接触GitHub, 建立个人博客个人介绍 📋标签 广东湛江 人 期望成为 golang后端工程师 学习经历持续学习golang及其框架, 设计模式 持续学习后端各个组件的可靠高效解决方案兴趣爱好…

清华大学推出的5册免费的 DeepSeek 学习使用指南!

前言 在当今这个信息洪流、技术飞速迭代的时代,DeepSeek的横空出世极大地降低了普通人利用人工智能技术的门槛。然而,尽管机遇就在眼前,仍有不少朋友面对DeepSeek感到无从下手,不知如何利用它来紧握时代赋予的红利。对此,清华大学展现出了高度的社会责任感与前瞻性,推出了…

拆解分析行业头部米家绿米燃气报警器怎么样?

小米绿米天然气卫士拆解,内置Zigbee模组,需要连接Zigbee 3.0网关 或者 具备Zigbee 3.0网关功能的设备报警 天然气是每家每户日常生活中都会使用到的清洁能源,因此对于天然气的安全防护时刻不能放松。小米天然气卫士是小米与业内知名品牌 赛特威尔 联手打造的一款产品,可探测…

C++ DLL 供 C# AnyCPU 调用 【 OpenCV onnxruntime】

背景 C++ 打包的DLL用到 OpenCV,用到 onnxruntime C# 软件需要打包成Any CPU版本,即可以在 x86下使用,也可以在x64下使用 C# 前端想把 C++ dll与依赖放在单独的”Libs“文件夹中,不是"Dubug"下 难点: 在C++ 中, OpenCV 和 onnxruntime 分别有x64和x86两个版本,…

Mac本地部署DeepSeek(简洁版)

1. 下载ollama2. 安装ollma 无脑安装那么最小的1.5b模型就拥有15亿的参数量,而最大的671b则有6710亿个参数,我们要使用的是前面这6个规模较小的模型。ollama run deepseek-r1:8b要等一会我不相信黑夜将至 因为火把就在我的手中。

使用OpenLPA编辑eUICC卡片

使用OpenLPA编辑eUICC卡片原文地址: [https://github.com/EsimMoe/MiniLPA/blob/main/README_zh-CN.md] 原作者:EsimMoe 许可: AGPL-3.0 license精美的现代化 LPA UI特性良好的跨平台支持 (Windows, Linux, macOS) 更友好的用户界面 i18n 多语言支持 搜索与快捷跳转 自由地管理…