AbstractQueuedSynchronizer同步器

AbstractQueuedSynchronizer(AQS)是Java并发包中的一个抽象类,位于java.util.concurrent.locks包下,它是构建锁和其他同步器(synchronizers)的基础框架。AQS的核心思想是基于一个双向链表来管理线程的等待队列,并通过一个整型的state变量来表示同步状态,从而实现线程间的同步控制。下面是对AQS关键原理的解析:

1. 内部结构

  • State(同步状态): AQS维护了一个名为state的volatile整型变量,这个变量代表了同步状态,其值的变化反映了锁的获取与释放状态。对于独占模式下的锁(如ReentrantLock),state值表示持有锁的次数;而对于共享模式(如SemaphoreCountDownLatch),它可能表示剩余的许可数。

  • 双向链表(FIFO等待队列): AQS内部维护了一个线程的双向阻塞等待队列,当线程尝试获取锁失败时,会被构造成一个节点(Node)并加入到队列中,遵循先进先出的原则等待唤醒。每个Node包含线程引用、前驱和后继节点引用,以及表示等待状态的标记。

2. 独占与共享模式

AQS支持两种同步模式:

  • 独占模式:同一时刻只有一个线程能获取到锁。如ReentrantLock,它允许同一线程重复获取锁,通过递增和递减state值来跟踪锁的持有情况。
  • 共享模式:允许多个线程同时获取锁。如Semaphore和CountDownLatch,这些同步器通过控制state的减少和增加来管理多个线程的访问权限。

3. CAS操作

AQS大量使用了Unsafe类提供的CAS(Compare and Swap)操作来实现线程安全的无锁状态更新。当线程试图改变同步状态时,不是直接修改state变量,而是先读取当前值,然后计算期望的新值,最后使用CAS操作尝试更新。如果成功,则认为操作成功;如果失败(即当前值已被其他线程改变),则通常会重新尝试整个过程,或者进入等待队列。

4. 公平与非公平策略

AQS支持公平锁和非公平锁策略。公平锁严格按照FIFO原则,等待队列中最先等待的线程将被优先唤醒;而非公平锁则允许插队,当前线程尝试获取锁时,即使队列中有等待线程,也有机会直接获取锁(如果当前没有其他线程持有锁)。

5. 线程的阻塞与唤醒

当线程无法获取锁时,会被封装成Node加入等待队列,并调用park方法阻塞自己。当锁释放时,AQS会选择一个合适的等待线程(通常是队首),通过unpark方法唤醒它,被唤醒的线程将再次尝试获取锁。

结论

AbstractQueuedSynchronizer通过一个灵活的模板方法设计模式,提供了构建自定义同步组件的基础,使得开发者能够轻松地实现复杂的同步逻辑,同时保证了高性能和线程安全。其核心在于精细的状态控制机制、高效的线程调度策略以及对现代处理器特性的充分利用。

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

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

相关文章

游戏录屏怎么录?学会这3个方法,轻松搞定

在数字时代,游戏录屏已成为游戏爱好者们热衷的一项活动。无论是为了记录自己的精彩操作,还是为了分享给朋友或粉丝,游戏录屏都为我们提供了一个全新的视角去欣赏和回味游戏带来的乐趣。 想要录制出精彩的游戏视频,一款好用的游戏…

深入理解C#中的readonly与const:区别与应用场景

目录 引言 readonly与const的基本定义 readonly与const的主要区别 readonly与const的使用场景 示例与解析 结论 引言 const 关键字 - C# reference | Microsoft Learn 只读关键字 - C# reference | Microsoft Learn 在C#编程中,readonly和const都是用于声明不…

error: RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413

当你用sourcetree 提交代码 报错 RPC failed: HTTP 413 curl 22 The reguested URL returned error: 413 4731719459468_.pic.jpg 1、修改缓存区大小 git config --global http.postBuffer 524288000 2、如果是自己公司搭建的git ,让人看看服务端有没有限制 3、尝试…

Doris:倒排索引

目录 一、倒排索引介绍 二、倒排索引语法 2.1建表时创建倒排索引 2.2 已有表增加倒排索引 2.3 删除索引 三、使用倒排索引 3.1 创建带有倒排索引的表 3.2 插入数据 3.3利用倒排索引查询 3.4 自定义分词 一、倒排索引介绍 倒排索引,是信息检索领域常用的索…

FFMpeg rtmp 推送本地yuv文件

可以借鉴的&#xff1a;C使用FFmpeg实现YUV数据编码转视频文件_C 语言_脚本之家 yuv文件下载地址&#xff1a;YUV Sequences 代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <iostream> extern "C" { #include "libav…

Node.js实验指南:完善接口服务器

上一章接口服务器&#xff0c;我们实现了一个异常简单的接口服务器。可能很多人会感觉有点不真实的感觉&#xff0c;接口这么简单吗&#xff1f;没错&#xff0c;就这么简单。 我们在真实项目的前后端对接中&#xff0c;调用接口&#xff0c;拿到数据&#xff0c;就是如此而已…

文心一言 VS 讯飞星火 VS chatgpt (291)-- 算法导论21.3 4题

四、假设想要增加一个 PRINT-SET(x) 操作&#xff0c;它是对于给定的结点 x 打印出 x 所在集合的所有成员&#xff0c;顺序可以任意。如何对一棵不相交集合森林的每个结点仅增加一个属性&#xff0c;使得 PRINT-SET(x) 所花费的时间同 x 所在集合元素的个数呈线性关系&#xff…

金顺心贸易有限公司简介

金顺心贸易有限公司成立于2015年&#xff0c;注册地位于风景如画的广西壮族自治区防城港市东兴市。 金顺心贸易如他们的名字一样&#xff0c;有着实实在在的业绩和口碑的。他们专注于国际贸易&#xff0c;主营越南进口食品&#xff1a;果汁饮料、春卷皮、调味品、汤底、米粉、…

定制聚四氟乙烯架子离心管架子消解管样品架

南京瑞尼克定制离心管架子、消解管架子、微波罐架子等&#xff0c;各种实验室所需器皿样品架。 我司聚四氟乙烯架子优势&#xff1a; 1.耐强腐蚀&#xff08;耐各种强酸强碱和有机溶剂&#xff09; 2.耐高低温&#xff1a;-200至250℃ 3.工艺精制&#xff0c;尺寸&#xff0…

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…

如何实现高精度PCB切割?— 在线式激光切割机解决方案

在线式PCB精密激光切割机是一种专门用于电子行业中印刷电路板&#xff08;PCB&#xff09;切割的高精度设备。以下是关于在线式PCB精密激光切割机的详细信息和特点&#xff1a; 1. 工作原理&#xff1a; 在线式PCB精密激光切割机主要通过激光束的高能量密度对PCB板进行瞬时加热…

git修改文件名称提交

要将Git中的修改文件名称的操作提交&#xff0c;需要按照以下步骤进行&#xff1a; 1. 使用命令行或Git GUI工具打开项目所在的目录。 2. 通过git status命令检查当前的工作状态&#xff0c;确保没有未提交的更改。 3. 使用git mv命令修改文件名称&#xff0c;该命令用于移动…

MessageBox 弹框确定延时

异常描述&#xff1a; MessageBox 弹框确定和取消执行不同操作时&#xff0c;完全加载需要一些时间&#xff0c;如果点击确定过快&#xff0c;可能导致执行错误的操作&#xff0c;可通过设置延时解决 以下设置只能点击确定和取消&#xff0c;没有关闭按钮&#xff0c;Esc健无效…

新手必备!短视频剪辑常用的18个技巧——剪映篇

导入素材&#xff1a;这里我们可以选择自己拍摄好的素材&#xff08;图片、视频或录制好的音频&#xff09;&#xff0c;按照顺序导入剪辑区剪辑。这一步是剪辑的基础&#xff0c;确定剪辑的大体思路与成片框架&#xff01;别忽略了&#xff0c;剪映官方素材库提供的素材&#…

私域流量的深度解析与电商应用

一、私域流量的核心价值 在当今数字化时代&#xff0c;流量成为了企业发展的重要资源。与公域流量相比&#xff0c;私域流量以其独有的私有性和可复用性&#xff0c;为企业提供了与用户建立深度联系的机会。私域流量不仅有助于企业精准触达目标用户&#xff0c;还能通过数据分…

python办公自动化之excel

用到的库&#xff1a;openpyxl 实现效果&#xff1a;读取单元格的值&#xff0c;写入单元格 代码&#xff1a; import openpyxl # 打开现有工作簿 workbookopenpyxl.load_workbook(现有工作簿.xlsx) # 选择一个工作表 sheetworkbook[交易表] # 读取单元格的值 cell_valueshe…

Sentinel如何使用BlockExceptionHandler实现限流/降级错误页面显示

1、修改配置项,打开对Spring MVC端点的保护 spring.cloud.sentinel.filter.enabled=true 2、编写 BlockExceptionHandler的实现类 MyUrlBlockHandler.java package com.codex.terry.sentinel.urlblockhandler;/*** 文件名称: MyUrlBlockHandler.java* 编写人: yh.zeng* 编…

微服务初识(一)

目录 1.什么是微服务&#xff1f;2.为什么出现微服务&#xff1f;2.1微服务的出现与发展2.2 系统架构的演变2.2.1 传统开发模式——单体架构2.2.2分布式架构2.2.3 微服务架构2.2.4 小结 3. 如何实现微服务&#xff1f;3.1 微服务开发3.2 微服务容器镜像构建3.3 微服务容器镜像管…

nginx更新https/ssl证书的步骤

一、上传nginx证书到服务器 上传步骤略。。。 二、更新证书 &#xff08;一&#xff09;确认nginx的安装目录 我这里的环境是/etc/nginx/ &#xff08;二&#xff09;确认nginx的证书目录 查看/etc/nginx/nginx.conf&#xff0c;证书目录就在/etc/nginx目录下 将新的证书tes…

甄选版“论软件系统架构评估”,软考高级,系统架构设计师

论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…