ConditionObject的await方法分析

news2024/11/24 16:48:30

ConditionObject的await方法分析

  • 判断当前线程是否中断,中断直接抛出非法监视器状态异常
  • 要是没有中断则通过addConditionWaiter()方法将该节点加入到Condition的单向链表中
  • 通过fullyRelease(node)方法一次新释放掉锁资源
  • 初始化一个状态模式为0的标记
  • 执行while判断,要是线程不在AQS队列中就挂起该线程(要是在AQS队列中可能有一种情况那就是该线程刚释放锁资源,立刻就被唤醒,所以他会进入AQS队列自然不用去挂起他)
  • 检查当前线程在获取锁资源的时候有没有被中断过

在这里插入图片描述

线程添加到Condition单项链表中的代码分析

  • 获取尾节点
  • 尾节点不为空,并且尾节点的状态值不为-2,那么就取消当前节点,并重新获取尾节点
  • 创建新的节点,并将节点的状态值设置为-2.
  • 如果当前节点是尾节点是null,直接将刚才创建的节点放置为第一个等待节点
  • 否则就排在尾节点的后面
  • 最后返回当前节点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析后半部分await()代码的含义

  • 判断当前线程的中断模式

在这里插入图片描述

  • 解释三目运算符,要是线程没有被中断,返回0
  • THROW_IE:中断唤醒
  • REINTERRUPT:signal唤醒,并且线程在AQS队列中
  • 此处存在一个细节就是Thread.interrupted()能查看当前线程状态并重置当前线程状态

在这里插入图片描述

  • 下面这个方法要是返回true,则意味着线程时中断唤醒并且在AQS队列中,只有以上两个条件都满足才会返回true。
  • 下面这个方法在singal也有一个一样的基于CAS的判断,要是能进来那么就说明是中断唤醒的线程
  • 将当前节点添加到AQS队列
  • 往后判断当前线程是否在AQS队列中,因为基于singal唤醒的线程可能不在AQS队列。

在这里插入图片描述
在这里插入图片描述

isOnSyncQueue(node)分析

  • 判断当前node节点是否在AQS队列上
  • 两个条件当前节点的状态为-2或者当前节点的前一个节点为空都是不在
  • 要是节点的下一个节点不为空就在了,因为在Condition的单向链表中没有next这个指针

在这里插入图片描述

findNodeFromTail(node)队列中找到当前节点

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础【Linux开发】

Linux基础【Linux开发】 1.Linux系统结构2.Linux内核下载流程3. 文本编辑器4. 软件包管理5. shell命令5.1 shell作为命令语言5.2 shell作为编程语言 6. makefile工程管理文件 1.Linux系统结构 2.Linux内核下载流程 Linux内核官方网站👇 3. 文本编辑器 vim 老…

TextCNN:用于文本分类的CNN网络

参考资料:文本分类之TextCNN与DPCNN TextCNN 是在2014年的论文 《Convolutional Neural Networks for Sentence Classification》中提出来的。 以下是TextCNN的网络结构: (1)TextCNN的第一层为 Embedding 层 Embedding 层的输入…

C++的右值引用和移动语义

1.左值和右值 在C中,每个表达式或者是左值,或者是右值。 左值(lvalue):可以出现在赋值表达式左侧的值,例如变量名a、数据成员a.m、解引用表达式*p等。左值可以被赋值和取地址。右值(rvalue):只能出现在赋值表达式右侧…

十七、多线程(下)

文章目录 一、线程互斥,它是对的,但是不合理(饥饿问题)——同步二、条件变量(一)概念(二)条件变量接口1. pthread_cond_init 创建条件变量2. pthread_cond_wait 等待条件满足3. pthr…

类的成员之:构造器(构造方法)

1.构造器的特征: 它具有与类相同的名称它不声明返回值类型。(与声明为void不同)不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值 2.构造器的作用: 1.创建对象2.初始化对象的…

StackLLaMA: A hands-on guide to train LLaMA with RLHF

Paper name StackLLaMA: A hands-on guide to train LLaMA with RLHF Paper Reading Note Project URL: https://huggingface.co/blog/stackllama Code URL: https://huggingface.co/docs/trl/index TL;DR Huggingface 公司开发的 RLHF 训练代码,已集成到 hugg…

产品设计-产品设计五要素

概念介绍 产品设计五要素分别是:战略层、范围层、结构层、框架层、表现层。自上而下的分析可用来分析已有的产品,自下而上分析则可以用来创造新的产品。下面是各个层级所包括的内容: 战略层:产品目标和用户需求(做什…

【STL(2)】

STL(2) 知识点回顾函数对象函数对象理解系统的仿函数仿函数应用 容器适配器stackdeque queuepriority_queue mapmap使用插入访问下标访问的应用:计算文件中单词的个数 知识点回顾 在STL库中存在三个容器适配器,stack - queue - p…

西门子200系列PLC学习课程大纲(课程筹备中)

西门子200系列PLC学习课程大纲如下表所示,共106课,关注我,让你从菜鸟变大神。 第1课西门子200PLC概述S7-200 PLC新特性是什么第2课S7-200 PLC的CPU介绍第3课S7-200 PLC编程软件介绍第4课S7-200 PLC通信方式有哪些第5课S7-200 PLC显示面板介绍…

6.1——我在CSDN的创作纪念日

文章目录 ⭐前言⭐相遇CSDN⭐切换到编程赛道的契机💖 好好的美工为什么切换编程赛道💖 转换编程赛道的催化剂 ⭐写博客的目的——写给未来的自己💖 初衷——为学习铺路💖 博客是灯——照亮前行的路💖 博客是路——互联…

wenet-基于预训练模型进行增量训练

1867-154075-0014 重中之重 run.sh脚本分析 wenet aishell脚本解析_weixin_43870390的博客-CSDN博客 一、准备工作 第一步:准备训练数据,拷贝到远程服务器 将准备好的数据文件0529_0531_dataset,上传到恒源云上的/hy-tmp/wenet/example…

数据结构与算法10:递归树、Trie树、B+树

目录 【递归树】 【Trie 树】 【B树】 【每日一练:最长公共前缀】 【递归树】 递归的思想是将大问题分解为小问题,然后再将小问题分解为更小的问题,直到问题的数据规模被分解得足够小,不用继续递归分解为止。如果把这个一层…

Effective第三版 中英 | 第2章 创建和销毁对象 | 用私有构造器或者枚举类型强化 Singleton 属性

文章目录 Effective第三版前言第二章 创建和销毁对象用私有构造器或者枚举类型强化 Singleton 属性 Effective第三版 前言 大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书…

如何在本地配置Github的项目--Python

如何在本地配置Github的项目 0. 引言1. 初步预览2. 配置环境2.1 环境已经给出2.2 环境未曾给出 3. 数据配置4. 依次调试5. 配置完成总结 0. 引言 Github上存在大量的代码。当下载下来后可能会存在疑惑:如何在本地配置对应的项目呢? 为了帮助新手解决这一…

【Android开发基础】购物车代码整理

文章目录 一、数据库设计二、Home界面三、购物车模块四、添加五、源代码 这个月总算忙完了,总算能够抽出时间来,认真写一下博客了。整理一下购物车的代码 一、数据库设计 基于SqLite简单设计一个数据存储逻辑 实体(接收数据) im…

【数据加密】古典密码Playfair

文章目录 一、引言1、主要任务2、分支3、密码体制分类4、攻击密码系统 二、普莱费厄体制1、构造字母表,设为密钥矩阵2、设立加密方法3、加密解密4、字典集合5、结果 一、引言 1、主要任务 解决信息的保密性和可认证问题,保证信息在生成、传递、处理、保…

Swin-Transformer详解

Swin-Transformer详解 0. 前言1. Swin-Transformer结构简介2. Swin-Transformer结构详解2.1 Patch Partition2.2 Patch Merging2.3 Swin Transformer Block2.3.1 W-MSA2.3.2 SW-MSA 3. 模型配置总结 0. 前言 Swin-Transformer是2021年微软研究院发表在ICCV上的一篇文章&#x…

数据的存储(浮点型)

目录 浮点型存储的规则 1.前面我们已经学过了整形在数据中的存储是以原码,反码,补码的形式在内存中存储的,那么浮点数是以什么样的形式存储的呢? 接下来我们通过一段代码来观察——> int main() {int n 9;float* p (float*…

String AOP的使用

面向切面编程,面向特定方法编程,以方法为对象,在不修改原方法的基础上,对方法进行操作扩展等,底层是通过动态代理实现的 使用开发步骤: 1、创建一个类,加上Aspect声明为一个AOP切面类&#xff…

2023 重新开始

感觉搞 IT 的日子最近都有点不太好过。 早上接到公司电话说今天是一个大日子。 为什么是大日子,相信所有人都是懂的。这次公司将会经历一次非常大的裁员,很不幸也在列表中。不过感觉这个好像也没有什么关系。 因为早就在意料之中的事情,经历…