首页 > 编程语言 >并发之AQS源码学习

并发之AQS源码学习

时间:2023-11-18 15:14:02浏览次数:28  
标签:head AQS LockSupport 链表 并发 tail 源码 双向 节点

/**
 *
 * 学习 AbstractQueuedSynchronizer
 *
 * 1. state是aqs的重要属性,说明锁的使用次数
 * 2. CustomAbstractQueuedSynchronizer,存在 head 与 tail 属性,所以其本身就是一个链表。并没有使用集合
 * 3. 双向链表(等待队列)
 *      1. head 永远都是伪节点(thead = null)
 *      2. tail 初始化时是伪节点(初始化时, head == tail),之后就不是了。
 * 4. node的作用就是封装线程信息,然后并放到链表中排队
 * 5. node节点有5种状态:
 *      1. 用于双向链表(CANCELLED、SIGNAL、0)
 *      2. 用于单向链表(CONDITION)
 *      3. 用于共享锁(PROPAGATE)
 * 6. 双向链表中 head与tail的节点状态永远是 0,中间节点的状态为 -1,被取消(无效/中断)的节点状态为 1
 * 7. 挂起线程:LockSupport.pack(thread); 唤醒线程:LockSupport.unpack(thread)
 * 8. 获取锁操作:acquire -> tryAcquire -> addWaiter -> acquireQueued(死循环) -> shouldParkAfterFailedAcquire
 *                  -> parkAndCheckInterrupt -> LockSupport.park -> setHead(可以认为,删除唤醒节点)
 * 9. 获取锁异常操作:cancelAcquire
 * 10.取消锁操作:release -> tryRelease -> unparkSuccessor -> LockSupport.unpark
 * 11. CustomAbstractQueuedSynchronizer类,是抽象类,但没有抽象方法。可以 new,但无法使用锁。
 *      因为 TryAcquire 与 TrgRelease 方法,一个是获取锁,一个是释放锁。但默认都是报错。需要子类集成后重写方法。
 * 12. 双向链表中是否可以不用head节点?
 *      可以不用。
 *      1.在设计之前就提出了伪节点的存在,
 *      2.head节点的使用可以简化
 * 13. 为什么是双向链表,而不是用单线链表?
 *      因为在使用单线链表时,删除中间节点时,无法将node.prev.next 指向node.next。解决方法只能不断遍历,增加了很多无用操作。
 *      而使用双向链表就没有这个问题
 *
 *
 *
 *
 * 3. 条件队列(ConditionObject,内部类)
 *
 * 查对条件队列与同步队列
 */

标签:head,AQS,LockSupport,链表,并发,tail,源码,双向,节点
From: https://www.cnblogs.com/zz-1q/p/17840513.html

相关文章

  • 医院绩效考核方案 医院绩效考核系统源码
    医院绩效考核系统是现代医院管理的重要方法和科学的管理工具。良好的绩效管理,有助于带动全院职工的工作积极性,有助于提高工作效率、提高医疗质量、改善服务水平、降低运营成本,全面提升医院的精细化管理水平。医院绩效考核系统可根据"医、护、技、管理和后勤不同岗位的目标要求,制定......
  • 一个简单案例的Vue2.0源码
    本文学习vue2.0源码,主要从newVue()时发生了什么和页面的响应式更新2个维度了解Vue.js的原理。以一个简单的vue代码为例,介绍了这个代码编译运行的流程,在流程中原始DOM的信息会被解析转换,存在不同的对象中。其中关键的对象有el、template、ast、code、render、renderfunction和vno......
  • 数字化医学影像管理系统PACS源码
    PACS系统,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络)以数字化的方式海量保存起来,当需要的时候在一定的授权下能够很快的调回使用,同时增加一......
  • java智慧工地AI视频管理平台源码
    智慧工地是指以物联网、移动互联网技术为基础,充分应用人工智能等信息技术,通过AI赋能建筑行业,对住建项目内人员、车辆、安全、设备、材料等进行智能化管理,实现工地现场生产作业协调、智能处理和科学管理。智慧工地的核心是以一种“更智慧”的方法来改进工程各干系组织和岗位人员相互......
  • Visual Studio编译调试MySQL源码
    最近想阅读下MySQL源码,虽然在linux下编译MySQL源码还是很顺利的,但是奈何不习惯在linux下阅读代码,比较喜欢用宇宙第一IDEVisualStudio来阅读调试代码,下面就记录下在windows上用visualstudio来编译MySQL5.7.44的源码。下载mysql源码浏览器打开网页:https://dev.mysql.com/dow......
  • Visual Studio中使用SourceLink调试Abp源码
    在VisualStudio中目前已经能轻松的调试Abp源码,只需要以下两步操作。【选项】中设置调试最重要的一步,Nuget安装SourceLink.Copy.PdbFiles库,启用SourceLink调试后未安装该库不会下载对应pdb文件启动调试,等待自动下载源码符号文件,然后就可以愉快的进行源码调试了。......
  • 常见面试题-HashMap源码
    了解HashMap源码吗?参考文章:https://juejin.cn/post/6844903682664824845https://blog.51cto.com/u_15344989/3655921以下均为jdk1.8的HashMap讲解首先,HashMap的底层结构了解吗?底层结构为:数组+链表+红黑树什么时候链表会转换为红黑树呢?当一个位置上哈希冲突过多时,会导致......
  • session源码、闪现、请求扩展
    session源码'''1app.session_interface默认是某个类的对象,以后全局对象session,就是SecureCookieSessionInterface()的对象2请求来了,会执行这个对象的:open_session方法3请求走了,会执行这个对象的:save_session方法4找出上面讲的--》读源码--》app.run()---->run_simp......
  • session源码,闪现,请求扩展
    1session源码......
  • 新冠肺炎疫情可视化系统-计算机毕业设计源码+LW文档
    开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:PyCharm浏览器:谷歌浏览器DROPTABLEIFEXISTSaboutus;/*!40101SET@saved_cs_client=@@character_set_client/;/!40101SETcharacter_set_client=utf8......