Inside AbstractQueuedSynchronizer 文档集合
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 文档集合相关推荐
- 一些可以参考的文档集合9
之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...
- 一些可以参考的文档集合8
一些可以参考的文档集合7_xuejianxinokok的博客-CSDN博客 之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuej ...
- 一些可以参考的文档集合10
之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...
- 一些可以参考的文档集合7
之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...
- 一些可以参考的文档集合11
之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuej ...
- 清软英泰plm服务器安装文档,操作文档集合 (安装和管理 AnswerBook2 服务器 - zh)
操作文档集合 AnswerBook2 集合 是一个逻辑书组.例如,您可有一个包括所有 SolarisTM 面向开发者的书的集合.此集合可能是一个 AnswerBook2 (SGML) 集合或一个 An ...
- 文档集合:Zeal真好用
写在开头:如果你一定要看中文文档,请关闭这篇文章. 开发过程中难免需要查询一下官方文档,尤其是当我们掌握并使用多门语言时,一个集合了所有文档的工具就很有帮助性. 单纯推荐一个软件:Zeal 这里是我收 ...
- 一些可以参考的文档集合4
20220523 RabbitMQ 的五种消息模型_RabbitMQ_Ayue._InfoQ写作社区RabbitMQ 提供了 6 种消息模型,但常用的是前面 5 种,第 6 种实际上为RPC,所以一般 ...
- 一些可以参考的文档集合1
20211029 MyNikko.com 微處理器博物館 - Intel CPU Museumhttps://www.mynikko.com/CPU/index.html 20211021 阿里开源的 ...
最新文章
- 宏基因组扩增子最新分析流程QIIME2:官方中文帮助文档
- 《背包问题》 动态规划
- linux tomcat7怎么安装,centos7安装Tomcat7,
- 杨元庆谈三年变化:IBM到底给联想带来什么?
- 图片html代码查看器,360度全景商品图片查看器
- Spring 事务底层原理,你会了吗?
- 数据挖掘十大算法之—C4.5
- python两数相乘代码_Python 实现大整数乘法算法的示例代码
- 个人课中所学vlan相关知识整理
- 去小机化思维(二)--【软件和信息服务】2015.03
- java8新特性:对map集合排序
- oracle数据库怎么切换实例,oracle切换数据库实例
- 干货分享 | 4万字全面解读数据中台、数据仓库、数据湖(建议收藏)
- RTT笔记-分析自动初始化机制
- K-折交叉验证(原理及实现)
- 【Echarts】- 制作饼图
- 清除dns缓存cmd命令行方式
- steamship 使用gpt-4
- 无人机数字孪生算法研究
- Flayway mysql自动生成版本_Flyway详解及Springboot集成Flyway的详细教程
热门文章
- c语言 浮点数的加减乘除,浮点数的加减乘除运算步骤
- 男孩姓岳取什么名字好听
- 中餐菜单分类名称创意_10款新颖创意菜换新菜单必备
- getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; is abstract解决
- php课程设计策划书,创意设计大赛策划书
- 经验总结|深度学习性能速查表
- Movavi PDFChef 2021 for Mac(PDF编辑器)
- QuickJs quick start
- Linux — 实操篇_01(XShellXftp的使用、vi和vim编辑器入门、实操命令_用户管理)
- 苹果x处理器多少_苹果16英寸MacBook Pro笔记本相比前代产品有什么变化?