Inside AbstractQueuedSynchronizer (1)

Inside AbstractQueuedSynchronizer (2)

Inside AbstractQueuedSynchronizer (3)

Inside AbstractQueuedSynchronizer (4)

Java中的并发包,是在Java代码中并发程序的热门话题。如果我们去读concurrent包的源码时,会发现其真正的核心是 AbstractQueuedSynchronizer , 简称 AQS 框架 , 而 Doug Lea 大神正是此包的作者。

之前也看过一遍 AbstractQueuedSynchronize,但印象不深,只有依稀的印象。这次重新学习一遍,并整理出笔记,希望对自己或者是别人有用。当然了,笔者也是浅显的过一遍,很多细节也并不是完全理解。

建议读者先看这个系列的文章:Inside AbstractQueuedSynchronizer,之后再继续本篇。

首先,AQS会对进行 acquire 而被阻塞的线程进行管理,说是管理,其实就是内部维护了一个FIFO队列,这个队列是一个双向链表。链头可以理解为是一个空的节点,除了链头以外,每个节 点内部都持有着一个线程,同时,有着两个重要的字段:waitStatus 和 nextWaiter。nextWaiter一般是作用与在使用Condition时的队列。而waitStatus则有以下几个字段:

  • SIGNAL 表示下一个节点应该被唤醒。为什么是下一个节点?因为刚刚说了,这个FIFO队列,链头都是一个空的节点,但此节点的 waitStatus 正好就表示了要对下一节点做的事情
  • CANCELLED 表示此节点持有的线程被中断,或者该线程为null了。节点只能是暂时停留在此状态,因为在线程进入AQS时,线程会找机会整理链表,包括删除CANCELLED状态的节点。
  • CONDITION 表示此节点是在另一个队列中 —— condition队列中。比如我们使用的ReentrantLock.newCondition()获得Condition对象进行await时,在AQS内部所产生的节点。
  • PROPAGATE 顾名思义,传播。这点比较难理解,需要仔细推敲。因为此状态是为共享同步器使用的。加入此状态,可以避免无谓的线程 park 和 unpark。按照我对代码的理解,这是对多个线程并发获取共享同步器(比如acquireShared)所进行的优化,至少有3个线程并发,但想要优化 效果明显的话,可能需要几十个线程并发的获取共享同步器(比如acquireShared),如果在并发量非常大的时候,对系统的吞吐量的作用应该不少。

AbstractQueuedSynchronizer内置一个state字段,用来表示某种意义——当ReentrantLock使用AQS的时 候,state被用来表示锁被重入的次数;当’Semaphore’使用AQS的时候,state则被用来表示当前还有多少信号量可被获取。

AbstractQueuedSynchronizer 支持两种模式,分别是独占式和共享式。两者进行获取和释放动作的思路都是差不多的。

获取同步器的流程如下:

if(尝试获取成功){return;
}else{加入等待队列;park自己;
}

释放同步器的流程如下:

if(尝试释放成功){unpark等待队列中第一个节点;
}else{return false;
}

只要环绕着这两个思路去看AQS中的代码,相信应该可以明白其中的主要原理。

Inside AbstractQueuedSynchronizer 文档集合相关推荐

  1. 一些可以参考的文档集合9

    之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...

  2. 一些可以参考的文档集合8

    一些可以参考的文档集合7_xuejianxinokok的博客-CSDN博客 之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuej ...

  3. 一些可以参考的文档集合10

    之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...

  4. 一些可以参考的文档集合7

    之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...

  5. 一些可以参考的文档集合11

    之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...

  6. 清软英泰plm服务器安装文档,操作文档集合 (安装和管理 AnswerBook2 服务器 - zh)

    操作文档集合 AnswerBook2 集合 是一个逻辑书组.例如,您可有一个包括所有 SolarisTM 面向开发者的书的集合.此集合可能是一个 AnswerBook2 (SGML) 集合或一个 An ...

  7. 文档集合:Zeal真好用

    写在开头:如果你一定要看中文文档,请关闭这篇文章. 开发过程中难免需要查询一下官方文档,尤其是当我们掌握并使用多门语言时,一个集合了所有文档的工具就很有帮助性. 单纯推荐一个软件:Zeal 这里是我收 ...

  8. 一些可以参考的文档集合4

    20220523 RabbitMQ 的五种消息模型_RabbitMQ_Ayue._InfoQ写作社区RabbitMQ 提供了 6 种消息模型,但常用的是前面 5 种,第 6 种实际上为RPC,所以一般 ...

  9. 一些可以参考的文档集合1

    20211029 MyNikko.com 微處理器博物館 - Intel CPU Museumhttps://www.mynikko.com/CPU/index.html 20211021 阿里开源的 ...

最新文章

  1. 宏基因组扩增子最新分析流程QIIME2:官方中文帮助文档
  2. 《背包问题》 动态规划
  3. linux tomcat7怎么安装,centos7安装Tomcat7,
  4. 杨元庆谈三年变化:IBM到底给联想带来什么?
  5. 图片html代码查看器,360度全景商品图片查看器
  6. Spring 事务底层原理,你会了吗?
  7. 数据挖掘十大算法之—C4.5
  8. python两数相乘代码_Python 实现大整数乘法算法的示例代码
  9. 个人课中所学vlan相关知识整理
  10. 去小机化思维(二)--【软件和信息服务】2015.03
  11. java8新特性:对map集合排序
  12. oracle数据库怎么切换实例,oracle切换数据库实例
  13. 干货分享 | 4万字全面解读数据中台、数据仓库、数据湖(建议收藏)
  14. RTT笔记-分析自动初始化机制
  15. K-折交叉验证(原理及实现)
  16. 【Echarts】- 制作饼图
  17. 清除dns缓存cmd命令行方式
  18. steamship 使用gpt-4
  19. 无人机数字孪生算法研究
  20. Flayway mysql自动生成版本_Flyway详解及Springboot集成Flyway的详细教程

热门文章

  1. c语言 浮点数的加减乘除,浮点数的加减乘除运算步骤
  2. 男孩姓岳取什么名字好听
  3. 中餐菜单分类名称创意_10款新颖创意菜换新菜单必备
  4. getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; is abstract解决
  5. php课程设计策划书,创意设计大赛策划书
  6. 经验总结|深度学习性能速查表
  7. Movavi PDFChef 2021 for Mac(PDF编辑器)
  8. QuickJs quick start
  9. Linux — 实操篇_01(XShellXftp的使用、vi和vim编辑器入门、实操命令_用户管理)
  10. 苹果x处理器多少_苹果16英寸MacBook Pro笔记本相比前代产品有什么变化?