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

相关文章

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

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

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

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

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