ReenTrantLcok Condition 原理笔记

2023-11-08

参考:深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
https://blog.csdn.net/javazejian/article/details/75043422

1.Condition节点
这里写图片描述
waitStatues:等待队列中结点的状态只有两种即CANCELLED和CONDITION,前者表示线程已结束需要从等待队列中移除,后者表示条件结点等待被唤醒
thread:与此节点关联的线程
nextWaiter:下一个节点
一个ReenTranLock有多个Condition条件等待序列,但是只有一个同步队列(AQS队列)
2.await()方法
await()方法主要做了3件事,是调用addConditionWaiter()方法将当前线程封装成node结点加入等待队列是调用fullyRelease(node)方法释放同步状态并唤醒后继结点的线程。三是调用isOnSyncQueue(node)方法判断结点是否在同步队列中,注意是个while循环,如果同步队列中没有该结点就直接挂起该线程,需要明白的是如果线程被唤醒后就调用acquireQueued(node, savedState)执行自旋操作争取锁,即当前线程结点从等待队列转移到同步队列并开始努力获取锁。
这里写图片描述
3.signal()方法
这里写图片描述
看这张图,执行signal方法后,首先去找条件等待队列中的第一个节点,移除掉第一个节点,加入到同步队列中,加入到同步队列以后会去判断其前驱结点是否已结束或者设置前驱节点状态为Node.SIGNAL状态失败,则通过LockSupport.unpark()唤醒被通知节点代表的线程,这样signal()操作就完成了,完成以后说明这个节点已经是同步队列中的节点了,所以把await方法中的循环判断呢条件结束了,然后去执行自旋获取锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReenTrantLcok Condition 原理笔记 的相关文章

随机推荐

  • 基于Matlab的BiLSTM实现

    问题背景 目前深度学习多使用python实现 不过想要配置好一个python的深度学习环境有时却并不轻松 常常因为各个第三方库版本兼容性问题而失败 相比之下 matlab仅需一次安装简化了不少工作 这几年matlab的深度学习工具箱也是发展
  • 高斯过程回归

    文章目录 效果一览 文章概述 研究内容 程序设计 参考资料 效果一览 文章概述 高斯过程回归 Matlab实现高斯过程回归多输入单输出预测 Gaussian Process Regression 研究内容 高斯过程回归 Gaussian P
  • OpenFeign 入门教程 - 基础篇

    目录 Spring Cloud OpenFeign 介绍 Feign 概述 Spring Cloud OpenFeign 概述 Spring Cloud OpenFeign 的特性 Feign 与 Spring Cloud OpenFeig
  • Centos7 linux 安装 redis 遇到的几个问题

    环境 centos7 redis 5 0 解决方案仅供参考 如不能解决问题 请查找请他方案 1 不能编译没有GCC 编译工具 make报错 make 1 persist settings Error 2 ignored CC adlist
  • DataX全量和增量mysqltomysql(二)

    全量mysqltomysql 进入目录编写json cd usr local datax job vi zabbixmysql2mysql json 写入的表结构要和reader的表结构一样 先建立好 编写json文件 job conten
  • Python爬虫学习笔记(一)————网页基础

    目录 1 网页的组成 2 HTML 1 标签 2 比较重要且常用的标签 列表标签 超链接标签 a标签 img标签 用于渲染 图片资源的标签 div标签和span标签 3 属性 4 常用的语义化标签 5 元素的分类及特点 块元素 行内元素 行
  • 企业微信开发(二)安全性全面升级

    参考地址 企业微信帐号ID安全性全面升级 接口文档 企业微信开发者中心 客户标签ID的转换 接口文档 企业微信开发者中心 涉及的ID有corpid userid external userid与unionid 标签ID 客户群成员 微信客户
  • C语言自定义类型详解(结构体+枚举+联合)

    目录 结构体 结构体的类型声明 结构体的内存对齐 位段 枚举 联合 共用体 结构体 结构体的类型声明 结构是一些值的集合 这些值称为成员变量 结构的每个成员可以是不同类型的变量 结构的声明 例如定义一个学生 typedef struct S
  • springboot 获取客户端IP地址方法

    在使用springboot时 需要获取访问客户端的IP地址 获取客户端IP地址 private String getIpAddress String ip request getHeader x forwarded for if ip nu
  • 设计模式之(七)-----模板方法模式

    我先设计个类图 非常简单的实现 你要悍马模型 我就给你悍马模型 先写个抽象类 然后两个不同型号的模型实现类 那我们把这个程序实现出来 HummerModel抽象类的程序清单如下 java view plain copy print pack
  • 今年金三银四不跳槽

    金三银四 又到了跳槽的季节 因为我的简历挂在网上 boss 直聘上 有些公司hr 主动聊天 猎头也打电话来 昨天中科院也打电话邀请面试 一般都是在25k 以上 当然 邀请投简历不代表面试 面试不代表能通过 通过不代表能拿offer 拿off
  • vscode中不能使用命令pnpm

    问题描述 在vscode中只能使用npm 其他的pnpm nr等等命令运行就会报错 但是用cmd在项目路径下运行又是可行的 解决方案 vscode邮件以管理员身份运行 不是管理员 会无权限更改 在vscode的中断输入命令get Execu
  • generator代码自动生成工具(动态生成注释、类注解、方法注解等)适用于swagger等需要配置实体类的场景

    generator代码生成器大家都不陌生 但是在实际的业务场景中 实体类只有属性 getter setter方法不满足需求 还需要手动去添加需要的功能 比如项目使用swagger生成api文档时 需要在实体类上标注 ApiModel 属性上
  • Java爱心代码

    public class Love public static void main String args throws InterruptedException int count 0 for float y 2 5f y gt 2 0f
  • 一篇文章了解软件测试基础知识

    今天带大家了解软件测试的基础知识 希望对你们有帮助 有说的不好的地方 还请多多指教 一 基础知识点 1 软件测试基础知识 2 测试流程 3 测试方法 4 测试用例设计 5 bug管理 二 课程内容 1 1 软件测试基础知识 1 1 1 软件
  • wav 音频按照时长切割成多个小音频文件(python 代码可运行)

    语音wav 分割写成函数 方面以后复用 测试效果正常 太长了不方便处理 import librosa import soundfile def wavfile split filename split at timestamp 20 min
  • ‘mvn’ 不是内部或外部命令,也不是可运行的程序 或批处理文件

    话不多说 先来一张图 提示 mvn 不是内部或外部命令 也不是可运行的程序 或批处理文件 这说明 Windows系统找不到mvn相关的命令 基本上就是环境变量没有配置 或者配置出错 操作步骤 搜索环境变量 打开 点击环境变量 在用户变量中
  • 编程真的有现在网上传的那么简单吗?

    任何岗位做好都不简单 做到行业顶尖水平 绝不是仅仅靠努力 特别在编程得世界里 对数学造诣要求很高 而有些人一出生在某方面天赋就很高 但绝大部分都是普通人 普通人学习半年做到入门级真不难 但是要做到知乎年薪水平 是非常难 大量的程序员薪资普遍
  • React-Redux 老版本 connext的使用记录(只为记录)

    注 新版 redux 用法中 使用useSelector useDispatch替代connect 这里只做老用法的记录使用 Redux最新用法参考 个人React专栏react初级学习 React Redux是一个用于将React应用程序
  • ReenTrantLcok Condition 原理笔记

    参考 深入剖析基于并发AQS的 独占锁 重入锁 ReetrantLock 及其Condition实现原理 https blog csdn net javazejian article details 75043422 1 Condition