AQS 抽象同步队列的简单理解

news2024/11/24 19:07:08

前置知识:

可重入锁又叫递归锁,同一个线程在外层方法获取锁的时候,在进入该线程内层方法会自动获取锁,不会因为之前已经获取过还没释放就阻塞   同一个线程可以多次获得同一把锁

每个锁对象都有一个锁计数器和一个指向持有该锁的线程的指针

隐式锁:synchronized

显式锁:ReentrantLock  显式锁指的是需要lock与unlock  加几次就必须解锁几次  不然其他的线程没办法获取锁

LockSupport:线程等待唤醒机制(wait/notify)改良加强版

传统:就是before   lockstupport出现之前的用法

synchronized与wait  notify

1、wait和notify必须要跟synchronized一起使用  否则不合法

2、一定是先阻塞再有人唤醒

condition与await与signal

他们都有两个约束1、线程都要先持有锁,2必须先等待后唤醒,线程才能被唤醒

after:

LockSupport:通过park   unpark 来阻塞和唤醒线程  不需要显式的加锁解锁了

通过许可证来控制            而且可以先通知再阻塞

为什么可以先唤醒线程后阻塞线程?

因为Unpark获得了一个凭证,之后再调用park方法 ,就可以名正言顺的凭证消费,故不会阻塞

为什么唤醒两次后阻塞两次,但是最终结果还会阻塞线程?

因为凭证的数量最多为1,连续调用两次unpark和调用一次unpark效果一样,只会增加一个凭证,而调用两次park需要消费两个凭证,证不够,不能放行  

两个车  只要一个通行证,证不够,所以不能通行。

正题:AQS抽象同步队列

AbstractQueuedSynchronizer:抽象队列同步器

AQS是什么?  ----->变量+队列  是ReentrantLock  、 CountDwnLatch ReentrantReadWriteLock的、Semaphore的带头大哥 是一种统一的规范

为什么有AQS->有阻塞就需要排队,实现排队就必然需要队列

AQS是个队列控制的同步器  队列里面呢  装的是线程节点  

AQS=state+CLH队列

Node=waitStatus+前后指针

 

从ReentrantLock入手来分析AQS

ReentrantLock加锁过程:1、尝试加锁  2.加锁失败,线程入队列 3、线程入队列后,进入阻塞状态

lock()   第一个线程占用

tryAcquire(arg)

addWaiter(Node.EXCLUSIVE)

acquireQueued(addWaiter(Node.EXCLUSIVE),arg))

在锁里面有一个state字段跟一个当前线程的字段用来做标志

队列中  有一个头结点一个尾结点   第一个节点是一个没有数据的节点  让他作为头结点  每一次进来一个线程就让第一个节点指向他   然后他成为尾结点

比方线程A此时占用了资源   线程B(此时在同步队列中)多次请求无果后  会被locksport给park(挂起)住  此时才算是真正的在“排队”坐稳了位置了

A办完业务了  此时要unlock    会将 “当前占用线程”改为null   并且设置state为0

此时会唤醒h  也就是抽象同步队列的头结点  头结点去唤醒下一个节点  也就是此时的B   B此时会被唤醒  被唤醒之后B会继续尝试去抢占资源  此时A已经离开   并且State为0  B成功抢占到资源

C继续B的流程

然后会让B节点变成新的哨兵节点占位  

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

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

相关文章

Python爬虫-D车网近半年(六个月)汽车销量排行榜

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有单独详细介绍过该平台当前月更新的最新汽车销量排行榜数据。感兴趣的同学,可往前翻阅查看(Python爬虫-某懂车平台之汽车销量排行榜)。 而本文,笔者将详细来介绍该平台近半年…

【git】git提交代码-使用简易指南

1、创建新仓库:git init 创建新文件夹,打开执行:git init ,创建新的git仓库 2、检出仓库:git clone 执行该命令,以创建一个本地仓库的克隆版本:git clone /path/to/repository 如果是远端服务器…

一文解析Systrace 的原理、流程及定制

一、原理和基本流程 Systrace是android性能调试优化的常用工具,它可以收集进程的活动信息,如界面布局、UI渲染、binder通信等;也可以收集内核信息,如cpu调度、IO活动、中断等;这些信息会统一时间轴,在Chro…

【ROS仿真实战】Gazebo仿真平台介绍及安装方法(一)

文章目录 前言一、Gazebo简介二、Gazebo仿真平台的基本概念三、Gazebo仿真平台的安装方法四、总结 前言 Gazebo仿真平台是一个广泛应用于机器人研发、测试和教育等领域的开源软件。它可以模拟机器人的运动、感知和控制等行为,并提供了丰富的物理引擎、传感器模拟和…

PYQT5学习笔记05——QObject父子对象API以及案例

一、父子对象API 我们在这里简单演示一下父子对象API的具体用法以及代码实现,父子对象API有五个,分别是setParent、parent、children、findChild、findChildren,接下来对每一个API都具体演示一下。 1、setParent(parent)和parent() setParen…

国外导师对博士后申请简历的几点建议

正所谓“工欲善其事,必先利其器”,想要申请国外的博士后职位,就要准备好相应的申请文书材料。如果说Cover Letter是职位的窍门砖,那么申请者的简历就是争取职位的决定性筹码。 相信大家已经看过许多简历的模版了,但是…

c++自学笔记

本笔记为从菜鸟教程边学边记录的笔记---》C 教程 | 菜鸟教程 面向对象程序设计 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。…

vsftpd.conf各参数含义

文章目录 初始vsftdp.conf翻译后需修改参数write_enableYES(启用任何形式的FTP写入命令)userlist_file/etc/vsftpd.user_list、userlist_enableYES、userlist_denyNOlocal_umask022(放开权限)chroot_local_userYES(限定…

【容器文件系统】了解容器 overlay 文件系统和 /var/lib/docker/overlay2下目录的作用

转载自 浅析 Docker overlay2 文件结构 docker(5): 层 朱双印 目的 有这个问题困惑着我:容器删除 docker rm 后,docker cp 到容器内的文件,在 /var/lib/docker/overlay2 目录中是否还会存在 答案:容器删除后 docker rm 后&…

银河麒麟操作系统,安装Gitlab 基于docker

不废话。直接上干货 操作系统信息 ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword) Kernel: 4.19.90-24.4.v2101.ky10.aarch64 Build: Kylin Linux Advanced Server release V10 (SP2) /(Sword)-aarch64-…

【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板

网购与WhatsApp等社交通讯平台有着密不可分的关系,为什么这么说呢?因为基本上所有的网购的平台都会提供查询、下单方式给客户,而WhatsApp是全世界使用率最高的通讯平台,所以大部分电子商户都会选择WhatsApp Business与电子商务连接…

「C/C++」C/C++静态链接库与动态链接库

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语案例环境:Win10VS2019一、链接库介绍二、静态链接库(Static Library)2.1、静态库优缺点2.2、静态库的创建2.2.1、创建静态库项目2.2.2、添加.h头文件…

实战案例分享 | 临近假期,项目突发各种问题…

五一的调休补班一下子把三个星期的作息成功打乱,大家在吐槽的同时也不忘给自己延长假期,平时加班攒下的假期都充分利用上了。但办公室的项目经理小李这两天总长吁短叹,感觉假期也要随时随地办公。一问才知原来是临近假期时,项目突…

ARL灯塔(无需VPS版)

标题随便写,能看到都是有缘人 搭建灯塔那么繁琐的步骤,远不如爆破一个灯塔是吧(狗头) 而且还可能买不起VPS的情况(例如我) 那不如写一个脚本去爆破灯塔的弱口令 整治网络安全 从你我做起 fofa语法: icon_hash"1708240621"…

零售新时代,零售行业数字化破局的新路径

深夜11点,门店店长小张还在加班,因为小张还需要盘点今日销售额、库存等信息,这些整理好的数据需要手动录入至总公司的系统中。 多门店的零售行业中,这是他们每天的工作日常:门店先通过excel做手工报表,再把…

ubuntu20.04之--CUDA的安装

文章目录 CUDA文件的下载CUDA文件下载地址 CUDA文件的安装安装结果 环境变量的配置CUDA安装结果验证 CUDA文件的下载 CUDA文件下载地址 https://developer.nvidia.com/cuda-toolkit-archive 选择合适自己电脑的版本进行下载,下载命令如下: $ wget htt…

【产品分析】如何利用咖喱外卖店铺数据进行营销分析Python

在外卖平台上经营咖喱店铺时,海量的订单数据和用户评价等信息将成为商家优化营销策略的重要依据。然而,面对大量的数据,如果没有合适的分析方法,这些数据就变得毫无意义。本文将介绍如何使用Python中常用的可视化工具和方法&#…

Stable Diffusion使用方法

SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…

2023年易派客工业品展圆满落幕 期待与您再次相遇

党的二十大指出,建设现代化产业体系。坚持把发展经济的着力点放在实体经济上,推进新型工业化,加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。 中国石化深入学习贯彻党的二十大精神,以打造世界领先洁净能源…

【严重】Strapi <4.5.6 远程代码执行漏洞(POC)(CVE-2023-22621)

漏洞描述 Strapi是Node.js开发的开源内容管理系统,Users-Permission 插件的电子邮件模板系统用于管理与用户权限相关的电子邮件通知(默认启用)。 Strapi 4.5.6之前版本中,Users-Permission 插件的电子邮件模板系统存在 SSTI(服务器端模板注…