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游戏效果文档》,描述了PlayDead公司在制作游戏《Inside》时所采用的渲染技术。文档内容涉及了游戏中的雾效、HDR泛光(bloom)以及其他与光照和渲染相关的高级技术。这些技术对于创造游戏的独特...
《深入理解CLR Inside Out》是针对.NET Framework中的Common Language Runtime(CLR)的工具,它能够帮助开发者特别是熟悉C/C++的程序员将C/C++结构体转换为C#结构体,以便在.NET环境中进行编程。这个工具对于那些...
标签中所提及的“I-BUS Inside”可能意味着文档将深入探讨I-BUS系统在宝马汽车内部的具体实现和应用。这个标签可以被理解为文档的一个主题或关键词,指向与I-BUS系统相关的所有技术细节。 3. 内容部分 内容部分的...
《Inside the Native API》是关于Windows NT操作系统内核函数的权威文档,对于深入理解Windows系统底层运作机制,尤其是驱动程序和内核级开发而言,它是一份不可或缺的参考资料。这份文档详细介绍了原生API(Native ...
Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...
Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...
Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...
《 Typora inside主题详解与应用指南》 在数字化文档编辑的世界里,Typora以其简洁、优雅的界面设计和强大的Markdown支持,受到了众多用户的喜爱。而Typora-inside-theme-master.zip这个压缩包则为Typora用户带来了...
Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...
文档可能会详细阐述SQLite如何在内存和磁盘之间管理数据,包括页缓存机制、B-Tree数据结构的使用以及VFS(Virtual File System)层如何允许SQLite在不同操作系统上运行。此外,作者可能还讨论了SQL语句的解析和执行...
"新建文本文档.txt"可能是一个简单的文本文件,可能是ODB++ Inside教程或说明的一部分,提供了关于如何使用ODB++格式的步骤、注意事项或者常见问题解答等内容。由于没有具体的文件内容,无法给出更详细的分析。 ...
ODB++ Inside Cadence Allegro 11.4 Windows 64 SA Setup是一个专门针对Cadence Allegro设计平台的官方插件,主要用于支持ODB++数据格式的输入和输出。ODB++是一种广泛使用的电子设计自动化(EDA)数据交换标准,它...
Microsoft Excel 2010 Inside Out 英文无水印原版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细...
《Inside the C++ Object Model》是一本由Stanley Lippman编著的深入解析C++对象模型的专业书籍。这本书详细探讨了C++编程语言在内存、类型系统、对象表示、继承、虚函数、模板等核心概念下的底层实现原理。通过阅读...
标题“CLRInsideOut2008_01”暗示了这是一个关于.NET框架,特别是与CLR(Common Language Runtime)相关的技术资源。描述提到“P/Invoke Interop Assistant小工具”,这是一款帮助开发人员处理C#与非托管代码交互的...
inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!...
Allegro自带的ODB++inside工具下载,DBinside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_Inside_...
例如,你可以创建如下的XML文档: ```xml <title>Inside XML Programming <author>John Doe <year>2023 ``` 2. XML结构 每个XML文档都必须有一个根元素,如上面例子中的`<library>`。元素可以包含子元素...
《Inside Microsoft SQL Server 2008》是一本专门针对高级T-SQL查询、查询优化及编程的技术书籍。本书面向具有丰富经验的程序员和数据库管理员(DBA),旨在帮助他们编写并优化在SQL Server 2008环境下的代码。接下来...