IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【并发编程060】AQS 独占式同步状态获取与释放 -> 正文阅读

[Java知识库]【并发编程060】AQS 独占式同步状态获取与释放

AQS 独占式同步状态获取与释放

AQS的 acquire 方法

image-20220415133433303

通过调用同步器的acquire(int arg)方法可以获取同步状态, 该方法对中断不敏感, 也就是 由于线程获 取同步状态失败后进入同步队列中, 后续对线程进行中断操作时, 线程不会从同 步队列中移出

上述代码主要完成了同步状态获取 、 节点构造 、 加入同步队列以及在同步队列中自旋等 待的相关工 作, 其主要逻辑是: 首先调用自定义同步器实现的tryAcquire(int arg)方法, 该方法 保证线程安全的 获取同步状态, 如果同步状态获取失败, 则构造同步节点 (独占式 Node.EXCLUSIVE, 同一时刻只能 有一个线程成功获取同步状态) 并通过addWaiter(Node node) 方法将该节点加入到同步队列的尾部, 最后调用acquireQueued(Node node,int arg)方法, 使得该节点以“死循环”的方式获取同步状态 。如果 获取不到则阻塞节点中的线程, 而被阻塞线程的 唤醒主要依靠前驱节点的出队或阻塞线程被中断来 实现。

image-20220415133457818

上述代码通过使用compareAndSetTail(Node expect,Node update)方法来确保节点能够被线 程安全添加。

在enq(final Node node)方法中, 同步器通过“死循环”来保 证节点的正确添加, 在“死循 环”中只有通过CAS将节点设 置成为尾节点之后, 当前线程才能从该方法返回, 否则 , 当前线 程不断地尝试设置 。 可以看出, enq(final Node node)方法将并发添加节点的请求通过CAS变 得“串行化”了。

image-20220415133548760

如何前驱节点是头节点, 则尝试获取 同步锁 。 而只有前驱节点是头节点才

能够尝试获取同步状态, 这是为什么? 头节点是成功获取到同步状态的节点 , 而头节点的线程释放了同步状态之后 , 将会 唤醒其后继节点, 后继节点的 线程被唤醒后需要检查自己的前驱节点 是否是头节点。

如果前驱节点不是头节点, 则获取同步锁失败, 那么线程 继续在同步队列中等待

独占式同步状态获取流程, 也就是acquire(int arg)方法调用流程如下所示:

image-20220415133635466

当前线程获取同步状态并执行了相应逻辑之后, 就需要释放同步状态, 使得后续节点能 够继 续获取同步状态 。 通过调用同步器的release(int arg)方法可以释放同步状态, 该方法在释 放了 同步状态之后, 会唤醒其后继节点 (进而使后继节点重新尝试获取同步状态) 。该方法代 码 如下所示:

image-20220415133659464

该方法执行时, 会唤醒头节点的后继节点线程, unparkSuccessor(Node node)方法使用 LockSupport (在后面的有关LockSupport题目来专门说明) 来唤醒处于等待状态的线程。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:15:04  更:2022-04-24 09:18:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:34:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码