AQS总结

详细分析地址:跳转

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.rhkb.cn/news/170983.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测技术概述

什么是目标检测? 在计算机视觉众多的技术领域中,目标检测(Object Detection)也是一项非常基础的任务,图像分割、物体追踪、关键点检测等通常都要依赖于目标检测。在目标检测时,由于每张图像中物体的数量、…

如何在用pip配置文件设置HTTP爬虫IP

首先,定义问题:在 Pip 中设置HTTP爬虫IP服务器,以便在网络上进行访问和下载。 亲身经验:我曾经遇到过类似问题,通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证:根据 pip 官方文档&#xff…

关于网络安全运营工作与安全建设工作的一些思考

以下内容是个人成长过程中对于网络安全运营工作的理解和思考,希望通过这篇文章帮助大家更好的去做安全运营体系化建设,开始吧! 文章目录 一、网络安全运营是什么?二、网络安全运营建设阶段第一阶段:设备限制阶段第二阶…

搭建docker本地仓库

1.拉取私有仓库镜像 [rootmaster1 ~]# docker pull registry [rootmaster1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v1 546db553f62a About an hour ago …

CGAL+QT

先安装CGAL和QT 安装完QT其中MSVC 这两个没配置 1、x32配置选择的是 x64配置选择的是 2、CGAL 5.4.5 - Manual: Using CGAL on Windows (with Visual C) 参数文章配置一些环境变量 3、 测试 新建build 进行cmake QT、Boost、CGAL都自动匹配上了(环境变量已经配…

C++数据结构X篇_19_排序基本概念及冒泡排序(重点是核心代码,冒泡是稳定的排序)

文章目录 1. 排序基本概念2. 冒泡排序2.1 核心代码2.2 冒泡排序代码2.3 查看冒泡排序的时间消耗2.4 冒泡排序改进版减小时间消耗 1. 排序基本概念 现实生活中排序很重要,例如:淘宝按条件搜索的结果展示等。 概念 排序是计算机内经常进行的一种操作,其目…

Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试,unittest模块特性、大致流程、源码及实战例子这几个模块,有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…

uni-app医院智能导诊系统源码

随着科技的迅速发展,人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中,智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用,分析其优势和未来发展趋势。 智能导诊系统通过人工…

Simulink和GUI联合使用

1、内容简介 略 9-可以交流、咨询、答疑 2、内容说明 Simulink和GUI联合使用 Simulink、GUI、参数传递 3、仿真分析 4、参考论文 略

设计模式之中介模式

文章目录 一、介绍二、生活中的中介模式三、中介模式中的角色四、案例演示1. 角色分析 五、优缺点 一、介绍 中介模式(Mediator Pattern),属于行为型设计模式。目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类…

【电路笔记】-电路中的复数与相量(Phasor)

电路中的复数与相量(Phasor) 文章目录 电路中的复数与相量(Phasor)1、概述2、复数定义3、复数计算规则4、电子领域的复数5、总结 复数是一种重要的数学工具,广泛应用于包括电子学在内的许多物理领域。 这个概念可能看起来很奇怪,但它们的操作很简单&…

CDR和AI哪个软件更好用?

设计软件市场中,CorelDRAW和Adobe Illustrator(简称AI)无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能,但究竟哪一个更好用?本文将从多个角度出发,对这两款软件进行全面而深入的比较&#xf…

Ubuntu下载、安装QGIS软件的方法

本文介绍在Linux操作系统Ubuntu版本中,通过命令行的方式,配置QGIS软件的方法。 在Ubuntu等Linux系统中,可以对空间信息加以可视化的遥感、GIS软件很少,比如ArcGIS下属的ArcMap就没有对应的Linux版本(虽然有ArcGIS Serv…

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

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

高级路由配置

目录 路由协议认证 Ripv2的认证配置 OSPF认证 BGP认证 OSPF特殊区域 BGP的选路规则 路由策略(route-policy和filter-policy) IP-Prefix List:前缀列表 Filter-Policy 路由引入(import-route) Filter-policy和route-pol…

腾讯云轻量应用服务器怎么样?来自学生的评价

腾讯云轻量应用服务器怎么样?CPU性能如何?我们班同学人手一台,轻量服务器简单高效快速部署,不限制CPU性能,并且费用很低,很适合我们这种群生群体。可以的话,可以推出一些适合学生用户的GPU实例&…

使用 jdbc 技术升级水果库存系统(后端最终版本,不包含前端)

1、配置依赖 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>junit</groupId><…

【Linux】MAC帧协议 + ARP协议

文章目录 &#x1f4d6; 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程&#xff1a;4.2 ARP协议格式&#xff1a; 5. 如何获得目的MAC地址 &#x1f4d6; 前言 在学完网络层IP协议之后&#xff0c;本章我们将继续向下沉一层&#xff0c;进入到数…

短视频矩阵系统搭建/源头----源码

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#xff…