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实现原理摘记相关推荐

  1. 人工智能内容生成元年—AI绘画原理解析

    AIGC体验生成 团队模型.论文.博文.直播合集,点击此处浏览 一.背景 2022年AIGC(AI生成内容)焕发出了勃勃生机,大有元年之势,技术与应用迭代都扎堆呈现.在各种新闻媒体处可以看到诸多关于学 ...

  2. java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理

    Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...

  3. SSH连接原理及ssh-key

    2019独角兽企业重金招聘Python工程师标准>>> Linux实战教学笔记24:SSH连接原理及ssh-key 目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SS ...

  4. java 同步块原理_Java同步代码块和同步方法原理与应用案例详解

    Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...

  5. MATLAB 与 音频处理 相关内容摘记

    原文地址为: MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 1 MATLAB 音频相关函数 1 MATLAB 处理音频信 ...

  6. ORACLE ERP 的前世今生摘记及原文

    "ORACLE ERP 的前世今生"一篇讲Oracle EBS历史的帖子,写的很不错,文采也很好,用K3做了些摘记,现贴出来 [ NOTE1] 1992年SAP推出划时代的第三代产 ...

  7. 眼图——概念与测量(摘记)

    原文地址为: 眼图--概念与测量(摘记) 中文名称: 眼图 英文名称: eye diagram;eye pattern 定义: 示波器屏幕上所显示的数字通信符号,由许多波形部分重叠形成,其形状类似&q ...

  8. Flink SQL空闲状态保留时间(idle state retention time)实现原理

    前言 如果要列举Flink SQL新手有可能犯的错误,笔者认为其中之一就是忘记设置空闲状态保留时间导致状态爆炸.2021年的第一篇技术文,时间很紧张,聊聊这个简单的话题吧. 为什么要设置 如果我们在数 ...

  9. Linux实战教学笔记26:http协议原理

    第二十六节 http协议原理 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载时请务 ...

最新文章

  1. 面试官:支撑日活百万用户的高并发系统,应该如何设计其数据库架构?
  2. java win8 mac地址_Win8怎么查看MAC地址_Win8查看电脑MAC地址方法-192路由网
  3. 【Python之旅】第二篇(三):基于列表处理的购物清单程序
  4. 从Sun离职后,我“抛弃”了Java,拥抱JavaScript和Node
  5. Apollo进阶课程 ⑧ | 高精地图的格式规范
  6. 解决vlc-android播放http视频退出问题
  7. 从核心技术到高可用实践——解密数据库深度挖掘指南
  8. 多线程的那点儿事(之windows锁)
  9. python单词的含义-python 前面几个单词含义
  10. 计算机三级网络技术无纸化考试模拟软件(2019.3 2019.9) 包含激活码 未来教育
  11. lisp语言画地物符号_地形图中的地物符号说明汇总
  12. c语言符号意思大全,c语言符号意思
  13. 用html5写一个通用的网页模板,html5网站模板-html5的最好用的模板!
  14. 【业务】5个顶级案例教你实现最牛供应链管理
  15. 她力量系列一丨复旦大学黄萱菁教授:期待更多女性领会计算机科学的奥妙
  16. cannot import name ‘DistanceMetric‘ from ‘sklearn.metrics‘
  17. Altium Designer 18中的Violations Associated with Components
  18. Elastic实战:canal自定义客户端,实现mysql多表同步到es
  19. Unable to locate tools.jar. Expected to find it in D:/jre6/lib/tools.jar问题解决
  20. Android 10 + 适用于国内各大手机厂商的开放匿名设备标识(OAID),若不支持OAID则随机生成一个全局唯一标识(GUID)

热门文章

  1. 台式计算机会淘汰吗,一体机电脑VS台式机,台式机会被淘汰吗?
  2. isf:一个极简的使用SVG的CSS图标框架
  3. 大数据助你“吃鸡”一臂之力!
  4. 小虎卫app远程控制无人值守手机
  5. Java中由继承得到的类成为_【填空题】Java中由继承而得到的类成为________,被继承的类称为父类。...
  6. postgresql取数字的整数部分 trunc函数
  7. Java实现发送邮件功能
  8. 教你制作Python进度条
  9. 文献翻译 载重汽车变速箱
  10. 奖项 | 2019金塔奖名单公布!