【Java并发】什么是AQS?

news2024/11/27 21:40:29

文章目录

    • 什么是AQS?
    • AQS与Synchronized的区别
    • AQS-基本工作机制
    • AQS是公平锁与非公平锁

什么是AQS?

全称是 AbstractQueuedSynchronizer,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架

所谓抽象,其实目的就是把具体的逻辑交给子类去实现,这样就可以实现不同的特性的锁:
例如:AQS常见的实现类
ReentrantLock 阻塞式锁
Semaphore 信号量
CountDownLatch 倒计时锁

AQS是多线程中的队列同步器。是一种锁机制,它是做为一个基础框架使用的,像ReentrantLockSemaphore都是基于AQS实现的.

AQS其实是一个抽象类,它实现了线程挂起的逻辑,实现了线程存储机制,实现了锁的状态逻辑,实现了线程唤醒的逻辑,却只定义了线程抢锁释放锁抽象,这样做的目的是将抢锁和释放锁的逻辑交给子类来实现,这样有助于实现各种不同特性的锁,比如共享锁,独占锁,公平锁非公平锁,可重入等。并且以模板方法模式将上述上锁流程和释放锁流程封装为固定模板方法。

所以AQS就是一个多线程访问共享资源的同步器框架。

AQS与Synchronized的区别

在这里插入图片描述
所以相比较Synchronized,基于AQS基础框架实现的各种特性不同的锁,对于解决多线程下锁的竞争可以提供不同的解决方案。

AQS-基本工作机制

AQS类自身有几个比较重要的属性:

```java
//正在持有锁的线程
private transient Thread exclusiveOwnerThread;
//等待队列的头节点
private transient volatile Node head;
//等待队列的尾节点
private transient volatile Node tail;
//锁标识字段
private volatile int state;

通过锁标识字段state来标志线程是否拥有锁
在这里插入图片描述
AQS-多个线程共同去抢这个资源是如何保证原子性的呢:
通过CAS操作(比较再交换)设置 state 状态,保证操作的原子性
在这里插入图片描述
当线程0和线程4同时去抢锁(修改state的值为1时)采用CAS的操作,使得线程0将state设为1,这时线程4再去修改state时不满足CAS操作的规则,这个时候不会自旋,而是直接加入(FIFO队列)等待队列。
在这里插入图片描述

AQS是公平锁与非公平锁

所谓公平不公平取决于:竞争的线程是队列的还是新的线程
新的线程队列中的线程共同来抢资源,是非公平锁
新的线程到队列中等待,只让队列中的head线程获取锁,是公平锁

公平锁:
在这里插入图片描述
在这里插入图片描述

当线程0释放锁的时候,让head指针指向的线程(线程1)去获取的锁执行自己的业务。
这就是公平锁

非公平锁:

在这里插入图片描述当线程0释放锁的时候,正好又有一个新的线程(线程5)进来了,那么如果线程5拿到了锁,队列中的head指针指向的线程没有拿到锁,
这就是非公平锁
在这里插入图片描述
公平锁和非公平锁各有优缺点,适用于不同的场景。公平锁的优点在于各个线程公平平等,每个线程等待一段时间后,都有执行的机会,而它的缺点相较于于非公平锁整体执行速度更慢,吞吐量更低。同步队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。

而非公平锁非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程。它的缺点呢也比较明显,即队列中等待的线程可能一直或者长时间获取不到锁。

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

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

相关文章

springboot项目get请求下划线转驼峰@JsonProperty注解失效问题

问题:解决sprigboot项目get请求中有下划线的入参参数,如:first_name,希望在项目中将下划线格式转成firstName,用JsonProperty注解发现失效问题 1.核查:JsonProperty注解对应包是否正确 正确包&#xff1a…

2023CNSS——WEB题解(持续更新)

[Baby] SignIn 进来看到 按钮点击不了,想到去修改代码,要“检查“,但这里的右键和F12都不可用 还好还有其他方法 检查的各种方法 选用一种后进入检查页面 删掉这里的disabled即可 点击后得到flag [Baby] Backdoor 进入&#xff0c…

2023河南萌新联赛第(五)场 K.01BFS

文章目录 传送门题目大意题解参考代码 传送门 https://ac.nowcoder.com/acm/contest/62977/K 题目大意 给定一个 n m n \times m nm 的矩阵 G G G ,每个点有权值 G i , j G_{i,j} Gi,j​,开始可以选择一个方向跳,每次跳跃只能跳到严格…

ECharts 折线图使用相关

一、折线图堆叠设置为不堆叠的方法 官网是这样的,但是不需要这种堆叠形式的如下图: 即:第2条数据值 第1条数据值 第2条数据值 第3条数据值 第2条数据值 第3条数据值 需要改成实际值展示,如下图: 只需要修改stack的…

湖南麒麟系统非正常关机导致VNC启动失败原因分析

1、故障描述 掉电后,启动vncserver无法启动,或启动后连接vncserver黑屏 2、影响范围 非正常关机流程的机器 3、故障处理过程 第一次开机后vncserver服务无法正常启动,使用restart手动也无法拉起。按照现场人员提醒使用reboot命令重启机器…

递归神经网络简介

一、说明 说起递归神经网络,递归神经网络(RNN)主要包括以下几种类型: 简单的RNN(Simple RNN):最基本的RNN类型,每个时刻的输出都与前面时刻的状态有关。 循环神经网络(R…

软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?

在当今互联网时代,软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么,这个测试的目的和意义是什么呢?另外,信息化建设验收测试依据又是什么呢?    一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…

低成本无刷高速吹风机单片机方案

高速吹风机的转速一般是普通吹风机的5倍左右。一般来说,吹风机的电机转速一般为2-3万转/分钟,而高速吹风机的电机转速一般为10万转/分钟左右。高转速增加了高风速。一般来说,吹风机的风力只有12-17米/秒,而高速吹风机的风力可以达…

信号浪涌保护器的综合应用方案

信号浪涌保护器是一种用于保护电子设备免受信号线路上的瞬态过电压和浪涌电流的影响的装置。信号浪涌保护器的原理是利用气体放电管、压敏电阻、齐纳二极管等元件,将信号线路上的过高电压限制在一定范围内,或将浪涌电流分流到地线上,从而减少…

gradio解决上传文件数最大为1000的限制

当使用上传文件夹功能传输超过1000个文件时,会报出以下错误: 在github上,最新版的gradio仓库已经解决了这一问题: 但是这一更改还没有正式发布,因此无法使用pip更新: 因此只能先手动git clone https://g…

webstorm debug调试vue项目

1.运行npm,然后控制台会打印下图中的地址,复制local的地址 2.run–>Edit Configuration,如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行,点击debug运行的图标运行即可

vue新学习 05vue的创建运行原理(vue的生命周期)

01.vue的创建过程 原理解释: 1.定义: 1.Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段,Vue在关键时刻帮我们调用的一些特殊名称的函数。 2.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求…

星戈瑞NH2-PEG-ICG应用纳米荧光成像

欢迎来到星戈瑞荧光stargraydye! NH2-PEG-ICG是一种具有胺基的聚乙二醇修饰的吲哚菁绿染料,常用于纳米荧光成像应用。以下是NH2-PEG-ICG在纳米荧光成像应用中的一些特点和优势: **1. 荧光性能:**NH2-PEG-ICG在近红外光谱区域(约7…

电商数据API接口有什么作用和意义,让我们来了解一下吧!

在现代互联网时代,电子商务已经成为了经济发展的重要推动力之一。越来越多的企业和个人开始通过电商平台进行商品销售,而准确的数据分析和及时的数据更新成为了他们的关键需求。而电商数据API接口,作为电商平台和第三方开发者之间的桥梁&…

星河双子塔对面万科星火城市更新规划出炉

龙岗区坂田街道欧威尔空调厂城市更新单元“工业上楼”项目规划(草案)已经龙岗区“工业上楼”项目工作专班2023年第四次审批会议审议通过。根据《中华人民共和国城乡规划法》《深圳经济特区城市更新条例》《深圳市城市更新办法实施细则》《深圳市“工业上…

手动创建一个DOCKER镜像

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…

600V EasyPIM™ IGBT模块FB30R06W1E3、FB20R06W1E3B11、FB20R06W1E3降低了系统成本和损耗,可满足高能效要求。

EasyPIM™ IGBT模块是一种三相输入整流器PIM IGBT模块&#xff0c;采用TRENCHSTOP™ IGBT7、发射器控制7二极管和NTC/PressFIT技术。该模块具有增强的dv/dt可控性、改进的FWD软度、优化的开关损耗以及8μs短路稳定性。EasyPIM&#xff08;功率集成模块&#xff09;外形非常小巧…

python工具库有哪些,python工具包怎么用

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python工具包有哪些&#xff0c;python工具包怎么用&#xff0c;现在让我们一起来看看吧&#xff01; 最近有多位读者留言&#xff0c;咨询更便捷、高效的python编程开发工具&#xff08;IDE&#xff09;&#xff0c;本…

词性标记:隐马尔可夫模型简介(1/2)

一、说明 作为人类&#xff0c;我们比这个星球上的任何动物都更了解自然语言的许多细微差别。比如说&#xff1a;“你吃了吗”&#xff0c;“企业吃不饱”&#xff0c;“吃豆腐”&#xff0c;“吃醋了”&#xff1b;同样一个“吃”&#xff0c;意义不同&#xff0c;从一个符号出…

tsmc12 加tap cell/boundary cell失败原因总结

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口 via0_grid tsmc12有via0的概念,boundary cell不需要对齐via0,但tap cell的pg pin是有via0这一层的,所以当tap cell添加失败,首先需要检查的就是via0_grid是否创建成功,offset能否对齐via0。 …