一、定义

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) 方法底层源码的更多相关文章

  1. Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. 为什么很多类甚者底层源码要implements Serializable ?

    为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...

  3. List-LinkedList、set集合基础增强底层源码分析

    List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...

  4. 从底层源码浅析Mybatis的SqlSessionFactory初始化过程

    目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...

  5. Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap

    声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...

  6. HashMap和ConcurrentHashMap的区别,HashMap的底层源码

    HashMap本质是数组加链表,根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap在HashMap的基础 ...

  7. 总结HashSet以及分析部分底层源码

    总结HashSet以及分析部分底层源码 1. HashSet继承的抽象类和实现的接口 继承的抽象类:AbstractSet 实现了Set接口 实现了Cloneable接口 实现了Serializabl ...

  8. LInkedList总结及部分底层源码分析

    LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...

  9. Vector总结及部分底层源码分析

    Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...

  10. 深入理解Whitelabel Error Page底层源码

    深入理解Whitelabel Error Page底层源码 (一)服务器请求处理错误则转发请求url StandardHostValve的invoke()方法将根据请求的url选择正确的Context ...

随机推荐

  1. C#添加log4日志

    第一步导入log4net 在vs的程序包管理器控制台中执行命令 NuGet\Install-Package log4net -Version 2.0.0 第二步加帮助类HttpHelper using ...

  2. 【python】如何优雅的终止while循环

    1. 背景需求 python需要与外界或终端交互时,常常需要使用while循环一直跑. 如果需要终止程序,一般使用Ctrl+c,此时终端会打印一大堆backtrace,并且无法保留当前运行的状态,非常 ...

  3. 分圆多项式(cyclotomic polynomial)

    最近论文中经常遇到分圆多项式,现在系统的学习一下! 本原单位根 之前介绍n次单位根,现在详细学习一下n次本原单位根(n-th primitive unit root) 一个复数是n次单位根,当且仅当具 ...

  4. uni-app中使用uView组件库

    01通过npm的方式安装uView组件库 uView依赖SCSS,您必须要安装此插件,否则无法正常运行. 如果您的项目是由HBuilder X创建的, 相信已经安装scss插件, 如果没有,请在HX菜 ...

  5. CSP2024 to do list...

    马上 CSP 了,感觉得开始培养状态了. 哈希练习 Tarjan 初步学习+刷题 大模拟练习:鸭棋+猪国杀 S 组初赛,选择题部分,刷整卷至少 3 套. 树状数组练习:DX视频 线段树优化 dp 练习 ...

  6. 如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型

    如何在啥也不懂的情况下将你的公众号接入DeepSeek或其它大模型 前言 最近国产大模型的"顶流"DeepSeek可谓是红得发紫,朋友圈刷屏的AI神回复.公众号爆款推文,都少不了它 ...

  7. 用python做时间序列预测六:相关函数图、偏相关函数图、滞后图

    经典的时间序列预测方法都是假设如果一个时间序列有显著的自相关性,那么历史值对预测当前值会很有帮助,但是究竟取多少阶的历史值,就需要通过分析相关函数图和偏相关函数图来得到.本文介绍如何什么是相关函数图和 ...

  8. AI+逆向python 3.9+程序

    使用pyinstxtractor.py将程序转换成pyc文件 下载 pyinstxtractor.py:extremecoders-re/pyinstxtractor: PyInstaller Ext ...

  9. 软件工程: SDLC V模型

    V型 V-model 代表一个开发过程,可以被认为是瀑布模型的扩展,是更通用的 V-model 的一个例子.不是以线性方式向下移动,而是在编码阶段之后向上弯曲工艺步骤,以形成典型的 V 形.V 模型展 ...

  10. autMan奥特曼机器人-对插件权限的管理

    为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...