AQS总结

news2024/12/16 13:58:27

详细分析地址:跳转

head等于NodeA,NodeA指向NodeB,NodeB指向NodeC,
tail等于NodeC。
NodeA也就是持有线程的Node,阻塞队列是指NodeA后面的所有队列,NodeA不属于阻塞队列。

公平锁

A线程先进来,调用tryAcquire,此时没有对象持有锁,A拿到锁开始执行任务,不创建Node,结束。此时A还没有释放锁。

B线程进来,调用tryAcquire,发现锁有被线程占用了,创建一个NodeB,此时head和tail都没有指向,创建一个空的Node,在把当前的NodeB追加到这个空Node后面。然后head指向这个空Node,tail指向这个NodeB。

这个时候来到acquireQueued方法,进到for,因为NodeB的前一个节点等于Head,所以尝试或获取锁,此时A线程还没释放锁,那么就会获取失败,然后就来到了shouldParkAfterFailedAcquire方法,在shouldParkAfterFailedAcquire里面会把NodeB的前一个节点,也就是空Node状态置为-1,接着返回false,然后又一次for循环。还是获取锁失败,在进到shouldParkAfterFailedAcquire,不过此时空Node是-1,此时NodeB,就会开始睡眠。所以在Node集合里面,Heade也就是空Node虽然等于-1,但是没有睡眠,而空Node的下一个节点NodeB,才是睡眠的那个,所以阻塞队列是从NodeB开始算的,空Node不能是阻塞队列。
后面有线程C进来,NodeC追加到线程B后面,并且把B的waitStatus改成了-1,进来的线程D也是一样,追加到后面。

当线程A释放锁时,这个时候会拿到Heade这个节点,当然此时Hade还是空Node,waitStatus等于-1,将其改为0,然后拿到空Node的下一个Node,也就是NodeB,不等于Null,然后唤醒NodeB,
此时NodeB又回到了acquireQueued方法里面,又尝试获取锁,这个时候,因为锁时空的,所以NodeB拿到了锁,并且NodeB变成了Head,然后线程B得到运行,此时阻塞队列就要从NodeC开始算了。这个时候真正有执行权的Head这个节点,一开始因为Head指向的空Node,所以执行权不在这个空Node上面,而是在线程A上。
然后B释放锁,此时aqs的status变成0,拿到Head元素,是NodeB,waitSatus=-1,进到unparkSuccessor里面,先将NodeB的waitStatus状态置为0,然后拿到NodeB的下一个线程NodeC,唤醒NodeC。依次循环。

小结:
所以在Node集合里面Node1,Node2, Node3 ,Node4。。。。。。NodeN

1、其中Head等于Node1, tail=NodeN,
2、持有锁的线程,就是Head,也就是Node1,也就是他不是睡眠,后面的Node,从Node2到NodeN都可以成为阻塞队列。每次唤醒的都是Head的后一个元素。也就是Node集合里面的第二个元素。
2、每次持有锁的线程都是Head,这里有个特殊时候,就是刚开始Node集合是空的时候,线程B进来发现Node集合是空的,所以会创建的空的Node,并且这个空的Node是Head,这样我们前面的说的“每次持有锁的线程都是Head”就不成立了,因为此时持有锁的线程是线程A,而A一开始是没有创建Node的。

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

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

相关文章

广西厂家直销建筑模板,工程用木工板,多层胶合板批发

欢迎选购我们的产品:广西厂家直销的建筑模板。作为一家专业厂家,我们提供工程用木工板,采用标准尺寸的多层胶合板制作,具备出色的防潮耐磨性能和高周转次数。 1. 工程用途:我们的建筑模板专为各类工程使用而设计&#…

(echarts)雷达图封装相关总结及使用

(echarts)雷达图封装相关总结及使用 数据结构&#xff1a; 页面&#xff1a; <div id"chart4" style"height:420px;width: 100%;" />//雷达图 echartFour(obj) {var chartDom document.getElementById("chart4");var myChart echarts.i…

浙大做了一个可用于AI领域的学术会议问答LLMs

深度学习自然语言处理 原创作者&#xff1a;wkk 今天介绍一篇来自于浙江大学的一项研究&#xff0c;关于基于LLM进行人工智能领域内7个不同学术会议QA数据集的论文。 论文: Reliable Academic Conference Question Answering: A Study Based on Large Language Model地址: http…

网络攻击的发展

在当今数字化时代&#xff0c;网站被攻击已经成为常态&#xff0c;网络威胁愈演愈烈。这些攻击不仅威胁到企业的安全&#xff0c;还可能导致严重的商业危机。本文将探讨为什么网络流量攻击变得如此普遍和容易&#xff0c;并分析未来可能引发的商业危机。 ​ 网络流量攻击的普遍…

【博士每天一篇文献-算法】iCaRL_ Incremental Classifier and Representation Learning

阅读时间&#xff1a;2023-10-27 1 介绍 年份&#xff1a;2017 作者&#xff1a;Sylvestre-Alvise Rebuffi; Alexander Kolesnikov; Georg Sperl; Christoph H. Lampert &#xff0c;牛津大学 期刊&#xff1a;Proceedings of the IEEE conference on Computer Vision and Pa…

竞赛选题 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

评比无代码低代码平台时,可以考虑以下几个方面

无代码低代码平台是近年来兴起的一种软件开发工具&#xff0c;它们旨在帮助非技术人员快速创建应用程序&#xff0c;而无需编写大量的代码。这些平台通过提供可视化的界面和预先构建的组件&#xff0c;使用户能够通过拖放和配置的方式来构建应用程序。选择无代码低代码平台时&a…

微信公众号点击打开地图导航

<h3 id"menu-location">地理位置接口</h3><span class"desc">使用微信内置地图查看位置接口</span><button class"btn btn_primary" id"openLocation">openLocation</button> <span class&quo…

发展高质量存储力,中国高科技力量聚浪成潮

中国信息通信研究院指出&#xff0c;在全球数字化转型与产业变革的浪潮下&#xff0c;算力正在成为改变全球竞争格局的关键力量。而根据最新的《算力基础设施高质量发展行动计划》&#xff0c;算力是集信息计算力、数据存储力和网络运载力于一体的新型生产力。当前&#xff0c;…

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…

vite vue3 ts 使用sass 设置样式变量 和重置默认样式

1.安装scss 样式支持依赖 yarn add -D sass 2.使用sass <div><!-- 测试使用sass --><h1>测试使用sass</h1> </div><style scope lang"scss"> div {h1 {color: red;} } </style> 效果&#xff1a; 3.通过npm下载并复制…

MarkDown教程记录

什么是 Markdown? Markdown 是一款轻量级标记语言&#xff0c;不同于HTML (Hypertext Markup Language)&#xff0c;Markdown 的语法非常简单&#xff0c;且容易上手Markdown 以 纯文本格式 编写文档&#xff0c;依赖键盘而非鼠标&#xff0c;专注于写作本身&#xff0c;感受…

为什么把k8s比做操作系统:kubernetes与os的架构对比

你还在背八大件吗&#xff1f;不如把k8s的架构和os一起看&#xff0c;你会发现一些超有趣的事情&#xff01;本文旨在将k8s的架构和os做个对比&#xff0c;帮助读者理解为什么k8s要这么设计。 kubernetes架构 kubernetes架构中由master节点和minion节点组成&#xff0c;maste…

c++ deque 的使用

目录 1. deque 的介绍 2. deque 底层原理 3. deque 的迭代器 4. deque 的接口使用 5. deque 和 vector&#xff0c;list 的比较 1. deque 的介绍 下面是 deque 的介绍&#xff0c;来自于&#xff1a;deque - C Reference (cplusplus.com) 的翻译&#xff0c;您可以不用…

MobPush数智化推送,精准定位万圣节狂欢年轻一族

随着中秋十一黄金周的结束&#xff0c;2023年最后一个法定节假日也一去不复返&#xff0c;但是别急&#xff0c;今年还有另一场不放假的狂欢节日——万圣节&#xff0c;万圣节作为西方国家第四季度最为重要的营销节日之一&#xff0c;在国内年轻人群体中同样具有较大的影响力和…

字节流和处理流的对象反序列化问题

细节&#xff1a; 读写要保持一致 序列对象时&#xff0c;默认将里面的所有属性都进行序列化&#xff0c;但除了static或transient修饰的成员 要求序列化或反序列化对象&#xff0c;需要实现Serializable 序列化对象时&#xff0c;要求里面的属性也要实现序列化接口 序列化…

java-- 静态数组

1.静态初始化数组 定义数组的时候直接给数组赋值。 2.静态初始化数组的格式&#xff1a; 注意&#xff1a; 1."数据类型[] 数组名"也可以写成"数据类型 数组名[]"。 2.什么类型的数组只能存放什么类型的数据 3.数组在计算机中的基本原理 当计算机遇到…

【优选算法精品】前缀和

文章目录 一、前缀和前缀和问题一维前缀和模板二维前缀和模板 细节处理题目1思路细节处理&#xff1a; 题目2思路 题目3题目4题目5题目6总结 一、前缀和 前缀和问题 前缀和用来快速解决某一段连续区间的和。 时间复杂度O(1) 注意&#xff1a;不要背模板&#xff0c;不要背模…

死锁Deadlock

定义 死锁是指两个或多个线程互相持有对方所需的资源&#xff0c;从而导致它们无法继续执行的情况。如下图所示&#xff0c;现有两个线程&#xff0c;分别是线程A及线程B&#xff0c;线程A持有锁A&#xff0c;线程B持有锁B。此时线程A想获取锁B&#xff0c;但锁B需等到线程B的结…

计算机网络之数据链路层(全)

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…