Reentlock实现原理摘记
ReentrantLock实现原理摘记
ReentLock实现了Lock接口,内部定义了一个final 的抽象类 Sync 他继承了AQS,因此ReentLock的很多事情其实都是由Sync类做的,而sync类中的方法实现都要借助AQS.
Sync 有俩个子类,分别是公平锁类FairSync,和非公平锁 NonfairSync ,以下是非公平锁获取锁的流程:
如果cas失败,则直接尝试抢锁
如果抢锁失败,则将当前线程封装为,EXCLUSIVE节点,加入CLH队列,并且让当前线程阻塞,
tryAcquire实际调用的是NonfairSync锁的nonfairTryAcquire方法
以下为CLH队列初始化的方法,并加入第一个节点的方式
然后会再有一次入队排序操作
对于公平锁而言,实现大体与非公平过程类似,但是在一开始的抢锁的步骤略有不同
第一次经过addWaiter,需要通过enq方法,队列进行初始化
因为enq内部是死循环,初始化好之后,继续再执行一次,执行如下所示
然后调用acquireQueued方法,抢占失败后 然后进入shouldParkAfterFailedAcquire,进行waitStatus的改变,主要是为了标记当前节点后面还有节点再等待唤醒.
总结,非公平锁的lock方法实现,直接用cas修改状态,然后再尝试抢锁过程,而公平锁则直接调用抢锁过程,抢锁过程会调用tryAcquire方法,如果锁状态是0,即非占有,非公平锁不会管CLH队列的顺序直接进行cas,抢锁失败了才会加入CLH队列尾部,而公平锁,则会判断CLH队列是否为空,如果不会空,直接把自己加入队列尾部。
Reentlock实现原理摘记相关推荐
- 人工智能内容生成元年—AI绘画原理解析
AIGC体验生成 团队模型.论文.博文.直播合集,点击此处浏览 一.背景 2022年AIGC(AI生成内容)焕发出了勃勃生机,大有元年之势,技术与应用迭代都扎堆呈现.在各种新闻媒体处可以看到诸多关于学 ...
- java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理
Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...
- SSH连接原理及ssh-key
2019独角兽企业重金招聘Python工程师标准>>> Linux实战教学笔记24:SSH连接原理及ssh-key 目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SS ...
- java 同步块原理_Java同步代码块和同步方法原理与应用案例详解
Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...
- MATLAB 与 音频处理 相关内容摘记
原文地址为: MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 1 MATLAB 音频相关函数 1 MATLAB 处理音频信 ...
- ORACLE ERP 的前世今生摘记及原文
"ORACLE ERP 的前世今生"一篇讲Oracle EBS历史的帖子,写的很不错,文采也很好,用K3做了些摘记,现贴出来 [ NOTE1] 1992年SAP推出划时代的第三代产 ...
- 眼图——概念与测量(摘记)
原文地址为: 眼图--概念与测量(摘记) 中文名称: 眼图 英文名称: eye diagram;eye pattern 定义: 示波器屏幕上所显示的数字通信符号,由许多波形部分重叠形成,其形状类似&q ...
- Flink SQL空闲状态保留时间(idle state retention time)实现原理
前言 如果要列举Flink SQL新手有可能犯的错误,笔者认为其中之一就是忘记设置空闲状态保留时间导致状态爆炸.2021年的第一篇技术文,时间很紧张,聊聊这个简单的话题吧. 为什么要设置 如果我们在数 ...
- Linux实战教学笔记26:http协议原理
第二十六节 http协议原理 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载时请务 ...
最新文章
- 面试官:支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
- java win8 mac地址_Win8怎么查看MAC地址_Win8查看电脑MAC地址方法-192路由网
- 【Python之旅】第二篇(三):基于列表处理的购物清单程序
- 从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node
- Apollo进阶课程 ⑧ | 高精地图的格式规范
- 解决vlc-android播放http视频退出问题
- 从核心技术到高可用实践——解密数据库深度挖掘指南
- 多线程的那点儿事(之windows锁)
- python单词的含义-python 前面几个单词含义
- 计算机三级网络技术无纸化考试模拟软件(2019.3 2019.9) 包含激活码 未来教育
- lisp语言画地物符号_地形图中的地物符号说明汇总
- c语言符号意思大全,c语言符号意思
- 用html5写一个通用的网页模板,html5网站模板-html5的最好用的模板!
- 【业务】5个顶级案例教你实现最牛供应链管理
- 她力量系列一丨复旦大学黄萱菁教授:期待更多女性领会计算机科学的奥妙
- cannot import name ‘DistanceMetric‘ from ‘sklearn.metrics‘
- Altium Designer 18中的Violations Associated with Components
- Elastic实战:canal自定义客户端,实现mysql多表同步到es
- Unable to locate tools.jar. Expected to find it in D:/jre6/lib/tools.jar问题解决
- Android 10 + 适用于国内各大手机厂商的开放匿名设备标识(OAID),若不支持OAID则随机生成一个全局唯一标识(GUID)
热门文章
- 台式计算机会淘汰吗,一体机电脑VS台式机,台式机会被淘汰吗?
- isf:一个极简的使用SVG的CSS图标框架
- 大数据助你“吃鸡”一臂之力!
- 小虎卫app远程控制无人值守手机
- Java中由继承得到的类成为_【填空题】Java中由继承而得到的类成为________,被继承的类称为父类。...
- postgresql取数字的整数部分 trunc函数
- Java实现发送邮件功能
- 教你制作Python进度条
- 文献翻译 载重汽车变速箱
- 奖项 | 2019金塔奖名单公布!