`
san_yun
  • 浏览: 2663402 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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游戏效果文档

    文档标题为《Inside游戏效果文档》,描述了PlayDead公司在制作游戏《Inside》时所采用的渲染技术。文档内容涉及了游戏中的雾效、HDR泛光(bloom)以及其他与光照和渲染相关的高级技术。这些技术对于创造游戏的独特...

    CLRInsideOut.zip

    《深入理解CLR Inside Out》是针对.NET Framework中的Common Language Runtime(CLR)的工具,它能够帮助开发者特别是熟悉C/C++的程序员将C/C++结构体转换为C#结构体,以便在.NET环境中进行编程。这个工具对于那些...

    I-BUS Inside Inside the BMW Cars entertainement Serial Bu

    标签中所提及的“I-BUS Inside”可能意味着文档将深入探讨I-BUS系统在宝马汽车内部的具体实现和应用。这个标签可以被理解为文档的一个主题或关键词,指向与I-BUS系统相关的所有技术细节。 3. 内容部分 内容部分的...

    Inside the native api

    《Inside the Native API》是关于Windows NT操作系统内核函数的权威文档,对于深入理解Windows系统底层运作机制,尤其是驱动程序和内核级开发而言,它是一份不可或缺的参考资料。这份文档详细介绍了原生API(Native ...

    ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.002

    Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...

    ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.006

    Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...

    ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.004

    Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...

    typora-inside-theme-master.zip

    《 Typora inside主题详解与应用指南》 在数字化文档编辑的世界里,Typora以其简洁、优雅的界面设计和强大的Markdown支持,受到了众多用户的喜爱。而Typora-inside-theme-master.zip这个压缩包则为Typora用户带来了...

    ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.003

    Allegro自带的ODB++inside工具下载,ODB++inside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_...

    Inside SQLite(SQLite技术内幕) 原版+个人翻译版

    文档可能会详细阐述SQLite如何在内存和磁盘之间管理数据,包括页缓存机制、B-Tree数据结构的使用以及VFS(Virtual File System)层如何允许SQLite在不同操作系统上运行。此外,作者可能还讨论了SQL语句的解析和执行...

    ODB++_Inside及说明.rar

    "新建文本文档.txt"可能是一个简单的文本文件,可能是ODB++ Inside教程或说明的一部分,提供了关于如何使用ODB++格式的步骤、注意事项或者常见问题解答等内容。由于没有具体的文件内容,无法给出更详细的分析。 ...

    ODB++_Inside_Cadence_Allegro_114_Windows_64_SA_Setup.7z

    ODB++ Inside Cadence Allegro 11.4 Windows 64 SA Setup是一个专门针对Cadence Allegro设计平台的官方插件,主要用于支持ODB++数据格式的输入和输出。ODB++是一种广泛使用的电子设计自动化(EDA)数据交换标准,它...

    Microsoft Excel 2010 Inside Out 无水印原版pdf

    Microsoft Excel 2010 Inside Out 英文无水印原版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细...

    inside.the.c++.object.model.pdf_inside_C++_

    《Inside the C++ Object Model》是一本由Stanley Lippman编著的深入解析C++对象模型的专业书籍。这本书详细探讨了C++编程语言在内存、类型系统、对象表示、继承、虚函数、模板等核心概念下的底层实现原理。通过阅读...

    CLRInsideOut2008_01

    标题“CLRInsideOut2008_01”暗示了这是一个关于.NET框架,特别是与CLR(Common Language Runtime)相关的技术资源。描述提到“P/Invoke Interop Assistant小工具”,这是一款帮助开发人员处理C#与非托管代码交互的...

    inside-ole英文版

    inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!inside ole 英文版,还是英文版看着舒服!...

    ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001

    Allegro自带的ODB++inside工具下载,DBinside插件可以将Allegro的.brd文件转化为仿真工具Hyperlynx使用的文件。共6个文件,需要分别下载。 ODB_Inside_Cadence_Allegro_111_Windows_64_SA_Setup.zip.001 ODB_Inside_...

    inside xml编程入门到精通

    例如,你可以创建如下的XML文档: ```xml <title>Inside XML Programming <author>John Doe <year>2023 ``` 2. XML结构 每个XML文档都必须有一个根元素,如上面例子中的`<library>`。元素可以包含子元素...

    Inside Microsoft SQL Server 2008

    《Inside Microsoft SQL Server 2008》是一本专门针对高级T-SQL查询、查询优化及编程的技术书籍。本书面向具有丰富经验的程序员和数据库管理员(DBA),旨在帮助他们编写并优化在SQL Server 2008环境下的代码。接下来...

Global site tag (gtag.js) - Google Analytics