当前位置: 首页 > news >正文

同步队列阻塞器AQS的执行流程,案例图

假设有A、B、C三个线程使用AQS抢占资源,A先到,抢占一段时间后释放,B后到,C最后到

同步队列阻塞器里面,初始,有head、tail指向null,state=0,当前抢占线程null,其中head,tail为Node类型,state为int类型,exclusiveOwnerThread(当前抢占线程)为Thread类型。
Node对象类型关键属性:next下一个节点指向、pre前一个节点指向、Thread拥有节点线程、waitStatus等待状态。
在这里插入图片描述

此时A线程最先到,通过CAS抢占资源。
state设置为1,代表已抢占。
抢占的线程为A,exclusiveOwnerThread=A
在这里插入图片描述

A抢到资源后继续执行。
此时B线程来到,发现同步队列阻塞器state=1,也就是已经被占用了,而且占有线程是A,所以B尝试CAS抢占资源,失败后开始排队。
排队流程是,线程B发现如果tail指向为null,先创建一个虚拟节点,同步队列阻塞器的head,tail指向虚拟节点

在这里插入图片描述

然后把线程B封装成Node节点。
线程B的pre指向虚拟节点,如果tail指向NodeB成功,则虚拟节点的next指向NodeB
在这里插入图片描述

把虚拟节点的等待标志设为-1,然后阻塞线程B
在这里插入图片描述

此时C线程来到,发现同步队列阻塞器state=1,也就是已经被占用了,而且占有线程是A,所以C尝试CAS抢占资源,失败后开始排队。
此时C发现tail指向不为null,所以直接在tail的指向,也就是NodeB后面排队。
节点C的pre先指向节点B
tail的节点如果指向节点C成功,节点B的next指向节点C
在这里插入图片描述

C线程会把节点B的等待状态设置为-1,然后阻塞线程C
在这里插入图片描述

如果此时A执行完了,会清空state和占有线程,让虚拟线程的waitStatus为0,并释放线程B
在这里插入图片描述

线程B释放后,会去占有资源,state=1,占有线程为线程B
会把虚拟节点置空,把NodeB变为虚拟节点
1.让head指向节点B
2.节点B的线程为null
3.节点B的pre指向null
4.虚拟节点的next指向null(为了被GC)
在这里插入图片描述

http://www.dtcms.com/a/288292.html

相关文章:

  • 张量交换维度(转置),其实是交换了元素的排列顺序
  • lvs集群技术(Linux virual server)
  • MinIO深度解析:从核心特性到Spring Boot实战集成
  • 笔试大题20分值(用两个栈实现队列)
  • 基于densenet网络创新的肺癌识别研究
  • lvs 集群技术
  • 渗透高级----第四章:XSS进阶
  • 如何优雅调整Doris key顺序
  • linux--------------------BlockQueue的生产者消费模型
  • 【Docker基础】深入解析Docker-compose核心配置:Services服务配置详解
  • Gitee 提交信息的规范
  • 算法基础知识总结
  • GoC 图片指令
  • BeanFactory 和 FactoryBean 的区别
  • 架构探索笔记【1】
  • 如何快速学习一门新技术
  • 实用的文件和文件夹批量重命名工具
  • 手撕Spring底层系列之:注解驱动的魔力与实现内幕
  • 【Linux】重生之从零开始学习运维之Nginx
  • 【服务器与部署 14】消息队列部署:RabbitMQ、Kafka生产环境搭建指南
  • Linux中添加重定向(Redirection)功能到minishell
  • 中小机构如何低成本搭建教育培训平台?源码开发+私有化部署攻略
  • 什么是帕累托最优,帕累托最优如何运用在组相联映像中
  • AspectJ 表达式中常见符号说明
  • GoogleBenchmark用法
  • 环形区域拉普拉斯方程傅里叶级数解
  • 电阻耐压参数学习总结
  • 再谈进程-控制
  • 敏感词 v0.27.0 新特性之词库独立拆分
  • 5-大语言模型—理论基础:注意力机制优化