【juc】AbstractQueuedSynchronized为什么采用双向链表

目录

          • 1. 说明
          • 2. 双向链表的特性
            • 2.1 双向指针
            • 2.2 高效操作
            • 2.3 支持双向遍历
          • 3. AQS的设计需求
            • 3.1 管理等待线程
            • 3.2 高效传播状态信息
            • 3.3 支持异常处理
            • 3.4 简化自旋竞争锁的逻辑
          • 4. 单向链表的局限性
            • 4.1 遍历方向受限
            • 4.2 节点删除操作复杂
            • 4.3 状态信息传播不便

1. 说明
  • 1.AbstractQueuedSynchronizer(AQS)采用双向链表的原因,主要基于双向链表自身的特性和AQS的设计需求。
2. 双向链表的特性
2.1 双向指针
  • 1.双向链表中的每个节点都有两个指针,一个指向前驱节点,一个指向后继节点。
  • 2.从任何一个节点出发,都可以方便地访问其前驱和后继节点。
2.2 高效操作
  • 1.双向链表支持在任意节点位置进行数据的插入和删除。
  • 2.这些操作的时间复杂度都是O(1),即不受链表长度的影响。
  • 3.这对于需要频繁对链表进行增删操作的场景非常有用。
2.3 支持双向遍历
  • 1.双向链表可以在任何一个节点方便地进行向前或向后的遍历,这对于有反向遍历需求的场景来说非常有用。
3. AQS的设计需求
3.1 管理等待线程
  • 1.AQS使用双向链表来实现等待队列,用于管理在同步器上等待的线程。
  • 2.当线程尝试获取锁但发现锁被占用时,该线程会加入到等待队列中等待。
  • 3.双向链表可以保持线程加入等待队列的顺序,即先加入的线程排在队列前面,后加入的线程排在队列后面,这有助于实现公平性。
3.2 高效传播状态信息
  • 1.在等待队列中,线程的状态可能会发生变化。
  • 2.当前驱节点释放锁时,需要唤醒后继节点。
  • 3.双向链表的结构可以使得这种状态信息的传播更加高效。
  • 4.每个节点都有指向其前驱和后继节点的引用,因此当前驱节点的状态发生变化时,可以立即影响到后继节点。
3.3 支持异常处理
  • 1.在同步队列中,可能存在因为异常或其他原因而不再需要竞争锁的线程。
  • 2.这些线程对应的节点需要从链表中删除。
  • 3.双向链表可以使得这种删除操作更加高效,因为可以直接通过前驱节点的引用找到需要删除的节点,而无需从头节点开始遍历。
3.4 简化自旋竞争锁的逻辑
  • 1.为了提高性能,新加入到链表中的线程会首先通过自旋的方式尝试竞争锁。
  • 2.在自旋竞争锁的过程中,需要判断当前线程所在节点的前驱节点是否是头节点。
  • 3.如果是头节点的下一个节点,则有必要去竞争锁;否则,就没必要再去触发锁竞争的动作。
  • 4.双向链表可以使得这种判断更加高效,因为可以直接通过前驱节点的引用进行判断。
4. 单向链表的局限性
4.1 遍历方向受限
  • 1.单向链表只能从头节点开始顺序遍历到尾节点,无法从尾节点向前遍历。
  • 2.这种限制在AQS中可能导致某些操作变得复杂或低效,特别是当需要反向查找或处理节点时。
4.2 节点删除操作复杂
  • 1.在单向链表中,删除一个节点需要知道其前驱节点(除非该节点是头节点)。
  • 2.而在AQS中,当某个线程释放锁并需要唤醒后继线程时,如果采用单向链表,则需要从头节点开始遍历以找到要删除和唤醒的节点,这会增加时间复杂度。
4.3 状态信息传播不便
  • 1.在单向链表中,状态信息(如锁状态、线程状态等)的传播通常依赖于遍历链表。
  • 2.而在AQS中,状态信息的快速传播对于提高同步器的性能至关重要。
  • 3.双向链表可以使得状态信息在节点之间更加高效地传播。

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

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

相关文章

文献解读-DNAscope: High accuracy small variant calling using machine learning

关键词:基准与方法研究;基因测序;变异检测; 文献简介 标题(英文):DNAscope: High accuracy small variant calling using machine learning标题(中文):DNAsc…

自动驾驶3D目标检测综述(一)

文章地址:[2206.09474] 3D Object Detection for Autonomous Driving: A Comprehensive Survey (arxiv.org) 这篇综述简单易懂,非常合适对自动驾驶和3D目标检测感兴趣的小白阅读,对相关算法进行初步理解。 目录 一、摘要 (一&a…

微软域名邮箱:如何设置管理烽火域名邮箱?

微软域名邮箱的设置技巧?免费域名邮箱注册设置教程? 微软域名邮箱为企业提供了一个强大且灵活的解决方案,帮助企业轻松管理其域名邮箱。烽火将详细介绍如何设置和管理微软域名邮箱,确保您的团队能够高效地使用这一工具。 微软域…

DirectShow过滤器开发-写AVI视频文件过滤器

下载本过滤器DLL 本过滤器将视频流和音频流写入AVI视频文件。 过滤器信息 过滤器名称:写AVI 过滤器GUID:{2EF49957-37DF-4356-A2A0-ECBC52D1984B} DLL注册函数名:DllRegisterServer 删除注册函数名:DllUnregisterServer 过滤器有…

新版 idea 编写 idea 插件时,启动出现 ClassNotFound

IntelliJ IDEA 2024.1.6 (Ultimate Edition) Build #IU-241.19072.14, built on August 8, 2024 Licensed to Sophia Tout Subscription is active until June 29, 2025. For educational use only. Runtime version: 17.0.111-b1207.30 amd64 Kotlin: 241.19072.14-IJ 新版本…

vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局

vue elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局 疑问点:iframe无法高度100%,如果写了100%就会有滚动条,所以只写了99.5% 【效果图】 路由示例 const routes [{title: Index,path: /,name: "Index"…

godot——主题、Theme、StyleBox

我刚开始被这些术语吓到了,一直不敢去接触它们,都用的默认样式。现在好不容易有点思路了,记录下来。 下面看看怎么自定义样式。 1.先新建一个Theme 2.再次点击创建好的Theme 得到 图1 这样一个面板。(看不懂没事,继…

web——sqliabs靶场——第二关

今天来搞第二关,来看看是什么咸蛋 1.判断是否存在sql注入漏洞 输入1 存在sql注入,报错语句为 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 0,1 …

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

【动手学电机驱动】STM32-FOC(5)基于 IHM03 的无感 FOC 控制

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

战略共赢 软硬兼备|云途半导体与知从科技达成战略合作

2024年11月5日,江苏云途半导体有限公司(以下简称“云途”或“云途半导体”)与上海知从科技有限公司(以下简称“知从科技”)达成战略合作,共同推动智能汽车领域高端汽车电子应用的开发。 云途半导体与知从科…

计算机毕业设计Hadoop+Spark高考推荐系统 高考分数线预测 知识图谱 高考数据分析可视化 高考大数据 大数据毕业设计 Hadoop 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【实用技能】ASP.NET Core:在同一个 Razor 视图中使用文档编辑器和查看器

Essential Studio for ASP.NET Core UI控件库是构建应用程序所需的卓越套件,提供支持的 ASP.NET Core 工具包拥有超过 85 个组件,包含构建业务线应用程序所需的一切,包括数据网格、图表、甘特图、图表、电子表格、时间表、数据透视网格等流行…

Mapwindow5代码BUG记录1

Mapwindow5代码BUG记录 一、查询功能多次点击后窗体错误1、正常情况2、BUG界面位置3、BUG表现4、BUG代码位置5、BUG代码修改6、BUG影响版本 一、查询功能多次点击后窗体错误 1、正常情况 2、BUG界面位置 表编辑器——》工具——》查找 Table editor——》Tools——》Find …

WPF中如何使用区域导航

1.创建一个Prism框架的项目并设计好数据源 User如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WPF练习17区域导航.Models {public class User{public int UserId { get; …

基于Cocos Creator开发的打砖块游戏

一、简介 Cocos简而言之就是一个开发工具,详见官方网站TypeScript简而言之就是开发语言,是JavaScript的一个超集详解官网 今天我们就来学习如何写一个打砖块的游戏,很简单的一个入门级小游戏。 二、实现过程 2.1 布局部分 首先来一个整体…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多,不存在谁替代谁,只有双剑合璧才能破敌万千~~😎😎 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

Rust编程与项目实战-特质(Trait)

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 特质(Trait)是Rust中的概念,类似于其他语言中的接…

运维之systemd 服务(Systemd Service of Operations and Maintenance)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…