AQS的acquire(int arg) 方法底层源码
一、定义
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) 方法
作用:如果队列为空则初始化队列,然后通过for循环将节点加入队列。
源码:

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)方法的执行流程
acquire(int arg) 方法的执行流程:
1、调用 tryAcquire(int) 尝试获取同步状态。
2、如果成功,则直接返回。
3、如果失败,则调用 addWaiter(Node) 将当前线程封装为 Node 并加入等待队列。
4、调用 acquireQueued(Node, int) 在队列中自旋或阻塞,直到成功获取同步状态。
5、如果线程在等待过程中被中断,则调用 selfInterrupt() 重新设置中断标志。
四、总结

AQS的acquire(int arg) 方法底层源码的更多相关文章
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 为什么很多类甚者底层源码要implements Serializable ?
为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- 从底层源码浅析Mybatis的SqlSessionFactory初始化过程
目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码
HashMap本质是数组加链表,根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap在HashMap的基础 ...
- 总结HashSet以及分析部分底层源码
总结HashSet以及分析部分底层源码 1. HashSet继承的抽象类和实现的接口 继承的抽象类:AbstractSet 实现了Set接口 实现了Cloneable接口 实现了Serializabl ...
- LInkedList总结及部分底层源码分析
LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...
- Vector总结及部分底层源码分析
Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...
- 深入理解Whitelabel Error Page底层源码
深入理解Whitelabel Error Page底层源码 (一)服务器请求处理错误则转发请求url StandardHostValve的invoke()方法将根据请求的url选择正确的Context ...
随机推荐
- w3cschool-Lua 教程
https://www.w3cschool.cn/lua/ Lua 学习笔记之一(初阶话题) 1.八种基本类型: 如下表 基本类型 描述 备注 数值(number) 内部以double表示 字符串(s ...
- w3cschool-R语言 教程
https://www.w3cschool.cn/r/ R语言教程 R语言是用于统计分析,图形表示和报告的编程语言和软件环境. R语言由Ross Ihaka和Robert Gentleman在新西兰奥 ...
- Spring,Spring Ioc,Bean详解
Spring框架 Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程) Spring的优势 低耦合/低侵入(解 ...
- 小程序 uni-app动态更改标题
uni-app动态更改顶部标题 uni-app uni.setNavigationBarTitle({ title: '编辑班级荣誉' }) 小程序 wx.setNavigationBarTitle( ...
- 国际“论”剑!天翼云数据库论文被EDBT收录!
近日,由天翼云数据库团队.中国电信云计算研究院和深圳北理莫斯科大学合作完成的<Taste: Towards Practical Deep Learning-based Approaches fo ...
- NSSM:简化Windows服务配置,提升系统维护效率
NSSM:简化Windows服务配置,提升系统维护效率 在Windows系统环境中,服务的配置与管理是一项复杂而重要的任务.传统的服务管理方式往往涉及繁琐的步骤,不仅效率低下,还容易出错.然而,随着N ...
- InfluxDB UI 设置保留策略
InfluxDB UI 设置保留策略 创建Bucket时设置保留策略 在InfluxDB 2.x的UI中创建Bucket时,你可以直接设置其保留策略.以下是一个基本的步骤指南: 登录到InfluxDB ...
- 陶瓷电容(MLCC),你真的了解吗?
摘要:本文主要介绍陶瓷电容(MLCC)的结构.阻抗-频率特性.直流偏压特性.温度特性和关键参数. 一.物理结构 多层片式陶瓷电容器(Multi-layer Ceramic Capacitor,MLCC ...
- Linux安装nodejs npm
1.检查 whereis nodejs whereis npm 2.下载 wget -c https://npm.taobao.org/mirrors/node/v12.12.0/node-v12.1 ...
- Luogu P9870 NOIp2023 双序列拓展 题解 [ 紫 ] [ 动态规划 ] [ 分治 ] [ adhoc ]
双序列拓展:很妙的特殊性质类 dp 题,由部分分引导向正解. 题意简化 你可以把序列 \(X\) 和序列 \(Y\) 中的每一个数复制若干倍并接到这个数后面,问能否构造出一种方案,使得两个序列长度相等 ...