首页 > 其他分享 >AbstractQueuedSynchronizer 学习

AbstractQueuedSynchronizer 学习

时间:2023-06-06 17:06:28浏览次数:41  
标签:状态 head 同步 AbstractQueuedSynchronizer 学习 获取 共享 节点


参考资料:

1、深入浅出AQS之独占锁模式
https://www.jianshu.com/p/71449a7d01af

2、深入浅出AQS之共享锁模式
https://www.jianshu.com/p/1161d33fc1d0


独占式

获取过程:

1、线程调用 acquire() 方法获取同步状态 state

2、如果 tryAcquire() 返回为 false (获取失败),将会调用 addWaiter(Node.EXCLUSIVE) 将当前获取同步状态失败的线程 作为新的节点 加入 同步队列(一个双向的 FIFO 队列,用于管理同步状态)的 tail,进行自旋(for(;;))(① 当前驱节点为 head,且获取到了同步状态,则设置当前节点为 head,原来 head 的 next 指向 null ② 如果获取失败后应该被 park,且 park 成功,则当前节点被阻塞,直到被 前驱节点 唤醒)

3、 如果 tryAcquire() 返回为 true,则获取同步状态成功

释放过程:

1、线程调用 release() 方法释放同步状态 state

2、如果 tryRelease() 方法返回 true,则调用 unparkSuccessor() 唤醒 head 的后继节点


共享式

获取:

1、线程调用 acquireShared() 方法获取同步状态 state

2、如果 tryAcquireShared() < 0,则获取同步状态失败。调用 addWaiter(Node.SHARED) 将当前获取同步状态失败的线程 作为新的节点 加入 同步队列(一个双向的 FIFO 队列,用于管理同步状态)的 tail,进行自旋(for(;;))(① 当前驱节点为 head,将尝试获取同步状态(tryAcquireShared()),如果获取到了同步状态(tryAcquireShared()>= 0),则设置当前节点为 head,并依次唤醒该节点后的所有共享节点,原来 head 的 next 指向 null ② 如果获取失败后应该被 park,且 park 成功,则当前节点被阻塞,直到被 前驱节点 唤醒)

3、如果 tryAcquireShared()>= 0,则获取同步状态失败。

释放:

1、线程调用 release() 方法释放同步状态 state

2、如果 tryRelease() 方法返回 true,则 doReleasedShared ()调用 unparkSuccessor() 唤醒 head 的后继节点


独占式与共享式的区别

跟 独占式 相比,共享式 的主要特征在于当一个在等待队列中的共享节点成功获取到 state 以后(它获取到的是共享锁),它必须要依次唤醒后面所有可以跟它一起共享当前锁资源的节点,毫无疑问,这些节点必须也是在等待共享锁



标签:状态,head,同步,AbstractQueuedSynchronizer,学习,获取,共享,节点
From: https://blog.51cto.com/u_16152603/6426041

相关文章

  • JDK 1.6 与 1.8 中的 ConcurrentHashMap 学习
    ConcurrentHashMap使用segment(继承ReentrantLock)和volatile来保证线程安全性segment的数量为16,每个segment中桶(HashEntry[])的数量可以增加,桶中放的是由HashEntry组成的链表;count表示segment中元素的数量,modCount统计导致结构变化操作的次数(put、remove、replace......
  • 0007.有监督学习之集成学习(Adaboost算法)
    一、集成学习概述1.集成学习算法定义集成学习(Ensemblelearning)就是将若干个弱分类器通过一定的策略组合之后产生一个强分类器。弱分类器(weakClassifier)指的就是哪些分类准确率只比随机猜测略好一点的分类器,而强分类器(StrongClassifier)的分类准确率会高很多。这里的“强”&......
  • 小白上车,又学习了一点
    #include<stdio.h>intmain(){ inta=0; charpassword[40]={0}; printf("输入密码="); scanf("%s",password); getchar(); printf("确认(Y/N:"); a=getchar(); if(a=='Y') { printf("输入正确\n"......
  • maven学习
    1.maven简介1.1软件是一个工程完成一个java项目,需要做哪些工作?分析项目要做什么,知道项目有哪些组成部分。设计项目,通过哪些步骤,使用哪些技术。需要多少人,多长的时间。组建团队,招人,购置设备,服务器,软件,笔记本。开发人员写代码。开发人员需要测试自己写代码。重复多次......
  • 开始学习spring 最初配置 步骤
    一:新建项目idea-----newproject----在Buildsystem在选择Maven---然后选create创建二:在file中选择ProjectStructure ---- 然后选择Modules----在Depedencies(依赖)中选择 加号 然后在本地电脑上导入所需要的jar包,记得每个jar包之前要选择打上对勾, 然后点击A......
  • bat文件格式学习
    "E:\work\Solver/Align.exe"-align"orignal_file.pgn""after_align_file"if%errorlevel%neq0exit/B%errorlevel%上面第一行的意思是:使用一个exe文件对初始文件:original_file.pgn进行align,然后得到after_align_file.pgn第二行的意思是,%errorlevel%(错误代码的意思......
  • MyBatis-plus学习笔记
    1、MyBatis-Plus(简称MP)是一个 MyBatis 的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。2、特性:无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作强大的CRUD操作......
  • 学习通如何下载章节目录里的ppt
    第一步:打开学习通页面,按下f12进入开发者工具第二步:选择网络,并点击想要下载的ppt,然后点击刷新网页,右下出现不同类型文件第三步:选择xhr型文件且名称比较奇怪的(如下图所示带有数字字母)文件第四步:将上步所述.xhr文件预览,并看到“pdf:”对应链接,将其copy,并在网页中打开,即可进行下......
  • JAVA学习笔记基础篇_02
    ------------恢复内容开始------------#java高级应用1.补充当方法中不存在与对象相关的方法时比如直接的数字计算输出等都可以写成静态方法集合成一个工具类1.类变量与类方法(静态变量/静态方法)也就是记录变量和方法的使用次数,每次随着类的生成而生成随着类的......
  • 大数据和机器学习的关系
    大数据和机器学习之间有密切的关系,它们相互促进和相互依赖。大数据是指海量、多样和高速生成的数据,涉及到数据的获取、存储、处理和分析等方面。大数据的出现使得我们可以处理以往无法处理的庞大数据集,从中获取有价值的信息和洞察。大数据技术包括数据存储和管理技术(如分布式文件系......