SynchronousQueue的TransferQueue源码分析

news2024/11/23 15:15:25

QNode的源码信息分析

  • 一行一行的分析大概内容;下面会省略大量的CAS操作
  • 当前节点可以获取到的next节点
  • item在生产者和消费者下有所不同。生产者是有数据。消费者为null。
  • waiter为当前线程
  • isData属性是用来区分消费者和生产者的属性。值得一提的是最终生产者需要将item交给消费者,最终消费者需要向生产者获取item

在这里插入图片描述

SynchronousQueue的TransferQueue源码中核心方法transfer方法分析

  • 作为TransferQueue的核心内容存在
  • e作为要传递的参数
  • timed属性,为false代表无限阻塞。true代表阻塞nacos时间
  • QNode s = null,是要封装当前的生产者和消费者信息。
  • 布尔类型的isData ,e要是为null,那么isData为false。代表消费者;反之要是e不为null,isData为true是生产者。
  • 下面这个死循环是作者的一种写作习惯。
  • 接下来的获取头节点head,获取尾节点tail。
  • 下面是健壮性判断,防止TransferQueue还没有被初始化。因为在TransferQueue的构造方法中是不会出现都为空的,只有一种可能那就是指令重排了,所以需要重新初始化。
  • 在这里插入图片描述

在这里插入图片描述

  • 接着上面说,判断h==t,代表头节点和尾节点相等。队列为空,没有生产者和消费者。或者要是前一个判断不成立,那说明队列中是存在元素,那就进行后续的判断,当前节点和队列节点是不是同一种角色。也就说要是队列中是存在生产者,那我来一看我也是生产者那么我也进队列。要是队列中存在的是消费者,那我过来一看我也是消费者那我也进队列。或循环的特点就是只要满足了任意一个条件那我就进队列。

  • 进来之后首先获取尾节点的next,要是t不是尾节点,说明当前由其他线程并发进来修改了tail,那就重新走for循环吧

  • 要是尾节点的下一个节点不为空,说明前面的线程存在并发添加了一个节点,那就修改尾节点的指向,重新走for循环。

  • 总结就是进来之后就是处理了并发的问题。

  • 前面都没有问题,那就没有并发问题我们继续。

  • 下面是一个判断 if (timed && nanos <= 0) ,判断当前线程是不是可以阻塞,要是timed为true代表可以阻塞一会,但是要是阻塞的时间小于等于0,那就不需要进行下去了。

  • if (s == null),经过前面的判断,证明可以阻塞,需要将加入到队列的节点构建出来。

  • (!t.casNext(null, s)) 这个是基于CAS的操作,将当前线程尾节点的next节点设置为新创建的节点s。但是主要是一个非判断,证明是失败才进来那就要说明修改失败了。需要重新for循环。

  • advanceTail(t, s); 还能继续说明CAS成功了,那就替换掉tail的指向。

  • Object x = awaitFulfill(s, e, timed, nanos);说明进入到队列中,那就需要挂起线程。等待消费者或者生产者。x则是作为替代返回后的数据
    在这里插入图片描述

  • 前面那个if判断没有进去,代表者队列中由元素,而我的类型还和那个不一样,那我就要进去消费了。

  • 获取头节点的next节点,作为要匹配的节点。

  • 下面这个三个或逻辑的判断,t不是尾节点,m为null,或者头节点不是头节点那就重新走for循环。

  • 否则说明并发没有问题,可以获取数据了

  • Object x = m.item;或者m的item节点作为x;

  • 首先下面这个判断x不为空,然后再才和左边这个判断类型是一致的话,那就说明出现了并发的问题,消费者匹配消费者,生产者匹配生产者没有意义。

  • x == m这个判断条件是说明节点取消了,那就没必要去匹配了。

  • !m.casItem(x, e))这个判断条件注意前面的逻辑非,要是判断到这里说明可以交换数据了,但是要是交换失败了,那也说明并发有问题。

  • 然后就需要方法块中的语句重新设置head节点,并且重新走一遍for循环。

  • 要是判断都没有进去说明一切正常,那就继续往后面走。

  • advanceHead(h, m);替换head

  • 唤醒head的next线程

  • 最后返回,要是x不为空那说明是生产者,那就直接返回x,要是为null,那就返回e

在这里插入图片描述

  • 判断要是元素和节点相等,那说明节点取消了。进入清空当前节点,将上一个节点的next指向当前节点的next,就是绕过当前节点。直接拜拜。
  • 判断当前节点是不是还在队列中
  • 要是在进入方法将当前节点这是为head
  • 要是x不为null,说明是消费者获取到了数据,将当前节点设置尾自己,方便GC,线程位置null
  • 最后返回数据,生产者不为null,返回自己生产的数据x,消费者则是返回消费的数据e。

在这里插入图片描述

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

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

相关文章

2023年我国省市县的高新技术企业数量(Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 目前&#xff0c;在城…

Android 13(T) - Media框架 - 异步消息机制

由于网上已经有许多优秀的博文讲解了Android的异步消息机制&#xff08;ALooper/AHandler/AMessage那一套&#xff09;&#xff0c;而且流程也不是很复杂&#xff0c;所以这里将不会去讲代码流程。本篇将会记录学习过程中的疑问以及自己的解答&#xff0c;希望可以帮助有同样疑…

机器学习——感知机模型(手动代码)

感知机&#xff0c;应该是很简单的模型了 1. 建立模型 感知机的模型&#xff0c;是一种多元线性回归符号函数的二分类模型。 多元线性回归函数&#xff1a;【Z &#xfeff;&#xfeff;&#xfeff; W T X W^{T}X WTX】 符号函数&#xff1a; y sign(Z) 1&#xff0c;当y…

vulhub-struts2-S2-008 远程代码执行漏洞复现

漏洞描述 影响版本: 2.1.0 - 2.3.1 漏洞原理 S2-008 涉及多个漏洞&#xff0c;Cookie 拦截器错误配置可造成 OGNL 表达式执行&#xff0c;但是由于大多 Web 容器&#xff08;如 Tomcat&#xff09;对 Cookie 名称都有字符限制&#xff0c;一些关键字符无法使用使得这个点显得…

JAVA-IO流实践操作

什么是IO流&#xff1f; I&#xff1a;Input O&#xff1a;Output 通过IO可以完成硬盘文件的读和写。 流是一连串连续动态的数据集合。可以理解为是我们在内存和硬盘之间进行文件读写的一个管道。抽象的一个概念。我们可以看成是一个管道&#xff0c;我们输入的数据要从管道…

C语言编程—强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#xff0c;如下所示&am…

PyTorch 深度学习 || 2. 全连接网络 | Ch2.2 PyTorch 全连接网络分类

PyTorch 全连接网络分类 文章目录 PyTorch 全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as plt from sklear…

从源码角度分析 MyBatis 工作原理

一、MyBatis架构 从 MyBatis 代码实现的角度来看&#xff0c;MyBatis 的主要组件有以下几个&#xff1a; SqlSession - 作为 MyBatis 工作的主要顶层 API&#xff0c;表示和数据库交互的会话&#xff0c;完成必要数据库增删改查功能。 Executor - MyBatis 执行器&#xff0c;…

前端自动化测试的核心概念及思考

本文&#xff0c;将主要结合钉钉中的业务实践和落地&#xff0c;描述笔者对前端自动化测试场景的理解。 本文将主要从“为什么前端要做自动化测试、前端自动化测试分类、业务做自动化测试要抓住的核心点、核心工具推荐“这四个部分做阐述&#xff0c;下面直接进入正文。 大钉…

【嵌入式Linux内核驱动】05_IIC子系统 | 硬件原理与常见面试问题 | 应用编程 | 内核驱动 | 总体框架

硬件原理 IIC协议 IIC 基础 IIC协议简介—学习笔记_iic标准协议_越吃越胖的黄的博客-CSDN博客 简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种串行通信协议&#xff0c;用于连接微控制器、传感器、存储器和其他外设。 I2C使用两条线&#xff08;SDA和S…

Spark 1--3章简介,架构体系, 环境搭建

今天开始了新的课程 由我们的星哥带领我们踏入Spark的神秘殿堂 01_SparkCore 1. Spark简介 1.1 什么是Spark Spark是一种快速、通用、可扩展的大数据分析引擎&#xff0c;2009年诞生于加州大学伯克利分校AMPLab&#xff0c;2010年开源&#xff0c;2013年6月成为Apache孵化…

Cisco模拟器配置OSPF

一、前言 1.1 本文为Cisco模拟器配置OSPF操作笔记 (供新手参考&#xff09; 使用Cisco模拟器&#xff0c;配置OSPF协议&#xff0c;并使各台电脑ping通&#xff0c;如下参考图&#xff01; 1.2 思科路由器设置ip设置 在将设备摆放完毕后&#xff0c;需要配置每台设备的IP&…

【科普】干货!带你从0了解移动机器人(四) ——移动机器人导航技术

移动机器人导航是指移动机器人确定自己在地图参考系中的位置后&#xff0c;自动规划出通往地图参考系中某个目标位置路径并沿着该路径到达目标位置点的能力&#xff0c;是移动机器人行动能力的关键。 基于整个智能制造的发展&#xff0c;移动机器人导航技术大致可分为以下几种&…

【MarkDown】CSDN Markdown之思维导图mindmap详解

文章目录 思维导图(Mindmap)一个思维导图的例子语法形状矩形圆角矩形圆形爆炸云朵六边形默认 图标和类图标类 不清晰的缩进Markdown字符串与库或网站资源集成 思维导图(Mindmap) Mindmap现在是一个实验性的图表类型。语法和特性可能会在未来版本中更改&#xff0c;除了图标集成…

【UE 从零开始制作坦克】9-坦克瞄准

效果 步骤 1. 将下载的图片资源导入 2. 再新建一个控件蓝图&#xff0c;命名为“WBP_Aim” 打开“WBP_Aim”&#xff0c;拖入图像控件 选择图像控件的锚点如下 偏移全部置0 图像选择刚导入的“miaozhunjing” 3. 打开骨骼“SKEL_West_Tank_M1A1Abrams” 可以看到在炮管上有一个…

房屋装修选择自装,如何寻找选购系统门窗,比价并施工(门窗阶段)

环境&#xff1a; 地点&#xff1a;杭州 装修类型&#xff1a;自装 面积&#xff1a;建面135平方 进度&#xff1a;选购安装铝合金门窗阶段 问题描述&#xff1a; 房屋装修选择自装&#xff0c;如何寻找选购系统门窗&#xff0c;比价并施工 解决方案&#xff1a; 一、了…

暑期托管班招生海报模板 一键就能完成设计

即将到来的暑期&#xff0c;许多的兴趣班也将迎来暑期招生热&#xff0c;那么兴趣班如何设计一幅招生用的招生易拉宝&#xff1f;可以一键生成内容&#xff0c;自定义填写兴趣班的报名方式&#xff0c;课程内容以及联系方式等内容的招生海报制作工具&#xff01;跟着教程一起使…

Rust之泛型、特性和生命期(三):Traits:定义共同的行为

开发环境 Windows 10Rust 1.70.0 VS Code 1.79.2 项目工程 这里继续沿用上次工程rust-demo Traits&#xff1a;定义共同的行为 Trait定义了一个特定类型所具有的功能&#xff0c;并且可以与其他类型共享。我们可以使用特质以抽象的方式来定义共享行为。我们可以使用特质的界…

低学历又如何?我这样的程序员照样可以逆袭

今天分享的这个主题&#xff0c;很可能会带来争议&#xff0c;因为目前优秀毕业生0年就可以拿到 20K 的待遇&#xff0c;这里暂且抛开硕士&#xff0c;985&#xff0c;211的 Top 前几高学校本科生。 毕竟今天的主题的初衷是地点低的程序员如何才能 2-3 年实现 20K 的目的&…