AbstractQueuedSynchronizer Node文档翻译

2023-12-24 19:38

本文主要是介绍AbstractQueuedSynchronizer Node文档翻译,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    一、概述  

 等待队列是“ CLH”(Craig,Landin和 Hagersten)锁定队列的变体。 CLH锁通常用于自旋锁。相反,我们使用它们来做阻塞同步器,但是使用相同的基本策略,即在其节点的前身中保存有关线程的某些控制信息。每个节点中的“状态”字段跟踪线程是否应阻塞。节点的前任释放时会发出信号。否则,队列的每个节点都充当特定通知样式的监视器,其中包含单个等待线程。虽然状态字段不控制线程是否被授予锁等。在队列中头节点线程可能会尝试获取,但是不能保证成功。 它仅授予竞争权。因此,当前被释放的竞争者线程可能需要重新等待。

      插入到CLH队列中,只需要对“尾巴”执行一次原子操作,因此存在一个简单的原子分界点,即从未排队到排队。同样,出队仅涉及更新“头”。但是,要确定节点的后继者是谁,需要花费更多的精力,部分原因是要处理由于超时和中断而可能导致的取消。

      “ prev”链接(在原始CLH锁中不使用)主要用于处理取消。如果取消某个节点,则其后继节点(通常)会重新链接到未取消的前任节点。有关自旋锁情况下类似机制的说明,请参见Scott和Scherer的论文,网址为http://www.cs.rochester.edu/u/scott/synchronization/。

      我们还使用“下一个”链接来实现阻塞机制。每个节点的线程ID都保留在其自己的节点中,因此前任通过遍历下一个链接以确定它是哪个线程,从而通知下一个节点唤醒。确定后继者必须避免与新排队的节点竞争来设置其前任节点的“ next”字段。在必要时,可以通过在节点的后继者似乎为空时从原子更新的“尾部”向后检查来解决此问题。 (或者换句话说,下一个链接是一种优化,因此我们通常不需要向后扫描。)

      取消将一些保守性引入了基本算法。由于我们必须轮询其他节点的取消,因此我们可能会遗漏一个被取消的节点在我们前面还是后面。要解决此问题,必须始终在取消合同时取消继任者,使他们能够稳定在新的前任身上,除非我们能够确定一个将要承担此责任的前任取消。

      CLH队列需要一个虚拟头节点节点才能开始。但是,我们不会在构建过程中创建它们,因为如果没有争用,这将是徒劳的。而是构造节点,并在第一次争用时设置头和尾指针。

      等待条件的线程使用相同的节点,但是使用附加的链接。条件只需要在简单(非并行)链接队列中链接节点,因为只有在专用时才可以访问它们。等待时,将节点插入条件队列。收到信号后,该节点将转移到主队列。状态字段的特殊值用于标记节点所在的队列。

二、属性

int waitStatus 表示节点的状态,包含的状态有 

状态含义
SIGNAL-1该节点的后继节点将要或者已经被阻塞,因此当前节点释放或取消时必须unpark其后继节点。为了避免竞争,acquire方法必须首先表明它们需要信号,然后重试原子获取,然后在失败时阻塞
CONDITION-2该节点当前在condition队列中。 在传输之前,它不会用作同步队列节点,那时状态将设置为0。(此处使用此值与字段的其他用途无关,但简化了机制)
PROPAGATE-3releaseShared应该传播到其他节点。在 doReleaseShared中设置了此设置(仅用于头节点),以确保传播继续进行,即使由于干预而进行的其他操作
CANCELLED1由于超时或中断,该节点被取消。 节点永远不会离开此状态。特别是具有取消节点的线程永远不会再次阻塞
 0表示当前节点在sync队列中,等待着获取锁
  • Node prev:链接到当前节点/线程用来检查waitStatus的先前节点。在入队期间分配,并且仅在出队时将其清空(出于GC的考虑)。同样,在取消前任后,我们会短路,同时找到一个未取消的前任,这将始终存在,因为根节点永远不会被取消:只有成功获取后,结点才变为根。取消的线程永远不会成功获取,并且线程只会取消自身,不会取消任何其他节点
  • Node next:链接到后继节点,当前节点/线程在释放时将其解散。在排队过程中分配,在绕过已取消的前辈时进行调整,在出队时清零(出于GC的考虑)。 enq操作直到附加后才分配前任的下一个字段,因此看到空的下一个字段并不一定意味着该节点位于队列末尾。但是,如果下一个字段显示为空,则我们可以从尾部扫描上一个以进行再次检查。被取消节点的下一个字段设置为指向节点本身而不是null,以使isOnSyncQueue的工作更轻松
  •  Thread thread:使该节点排队的线程。在构造时初始化,使用后置为空。
  •  Node nextWaiter:链接到等待条件的下一个节点,或者链接到特殊值SHARED。由于条件队列仅在以独占模式保存时才被访问,因此我们只需要一个简单的链接队列即可在节点等待条件时保存节点。然后将它们转移到队列中以重新获取。并且由于条件只能是互斥的,因此我们使用特殊值来表示共享模式来保存字段。

 

 

这篇关于AbstractQueuedSynchronizer Node文档翻译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532900

相关文章

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python Pillow 库详解文档(最新推荐)

《PythonPillow库详解文档(最新推荐)》Pillow是Python中最流行的图像处理库,它是PythonImagingLibrary(PIL)的现代分支和继承者,本文给大家介绍Pytho... 目录python Pillow 库详解文档简介安装核心模块架构Image 模块 - 核心图像处理基本导入

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事