【JUC】三十、什么是AQS

文章目录

  • 0、背景
  • 1、AQS介绍
  • 2、AQS核心概念
  • 3、AQS是JUC的基石
  • 4、锁和同步器的关系
  • 5、AQS的作用
  • 6、state和CLH队列
  • 6、AQS的内部类Node

0、背景

一段常见的代码:

Lock lock = new ReentrantLock();
lock.lock;
try{
	//do Something
} finally{
	lock.unlock();
}

简单的一个加锁解锁,多线程来抢锁,抢不到锁的线程被分配到哪儿去了?放到一个队列中,后续再出对入队?队列底层又是怎么维护的?

1、AQS介绍

AQS,即AbstractQueuedSynchronizer,抽象的队列同步器。AQS是JUC的基石,好比JVM之于Java。

AQS是用来实现锁或者其它同步器组件的公共基础部分的抽象实现, 是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给"谁"的问题

AQS相关类是:

在这里插入图片描述

  • AbstractOwnableSynchronizer(下面两兄弟的父类)
  • AbstractQueuedLongSynchronizer:since1.6
  • AbstractQueuedSynchronizer:简称AQS,since1.5

三者都是抽象类。(抽象类,相比接口的全抽象,属半抽象,完成了一部分逻辑,剩余一部分定义了方法规范,给子类去继承和重写)

2、AQS核心概念

以下是AQS类的解释,关键词:先进先出的一个队列 + state状态值

在这里插入图片描述

类比人(线程)去银行(共享资源对象)排队办理业务,有人到窗口开始办时,指示灯变红(state=1,getState、setState),代表有人,其余人去候客区的椅子上等着:

在这里插入图片描述

这个候客区,整体就是一个抽象的FIFO队列来完成对获取资源线程的排队工作,并通过一个int类变量表示持有锁的状态

在这里插入图片描述

这个抽象队列,称为CLH队列,CLH即Craig、Landin and Hagersten,是三个人名,是一个单向链表,但AQS中的队列是CLH变体的虚拟双向队列FIFO,等待的线程就进入这个队列。

3、AQS是JUC的基石

之所以成AQS是JUC的基石,是因为JUC的很多东西底层都是通过AQS实现的,如图:

在这里插入图片描述

举个例子,比如ReentrantLock:

在这里插入图片描述

4、锁和同步器的关系

锁:

  • 面向普通开发者,给开发者用的
  • 定义了开发者和锁交互使用的API,比如lock、unlock,隐藏了实现细节,调用即可

同步器:

  • 面向锁的实现者,Java并发的缔造者
  • 提出统一规范并简化了锁的实现,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等公共的底层细节,将其抽象出来,形成抽象的公共基类,做为一切锁和同步组件实现的公共基础部分

5、AQS的作用

加锁会导致阻塞,有阻塞,抢不到的线程就需要排队,实现排队必然需要队列。类比银行办理业务的窗口满了,其他人去候客区等待,但等待的线程仍然保留了获取锁的可能,且获取锁的流程仍在继续(候客区的顾客也在等着被叫到号)。

在这里插入图片描述

如果共享资源被占用,就需要一定的阻塞、唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS同步队列的抽象表现。它将要请求共享资源的线程及自身的等待状态封装成队列的结点对象 Node(候客区的一把把椅子),通过CAS自旋以及LockSupport.park()的方式,维护state变量的状态,使并发达到同步的效果。

在这里插入图片描述

AQS使用一个volatile的int类型的成员变量state来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作,将每个要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。

在这里插入图片描述

6、state和CLH队列

AQS类、Node类以及JUC相关类的关联关系如下:

在这里插入图片描述

AQS类,有个int类型的成员变量state:

private volatile int state;

它就类似去银行办理业务的受理窗口状态。0就是没人,自由状态可办理,大于等于1就是有人占用窗口,其他人坐在候客区(队列)的椅子上(Node)等着去。而CLH队列,一个双向队列,就是候客区,队列中装的就是一个个Node内部类的对象。

在这里插入图片描述

总结:AQS的实质就是CLH的双端队列,加一个state变量,队列中排队的每个个体就是一个Node。

6、AQS的内部类Node

,Node也有一个属性,waitState,和state是两个东西

银行候客区的椅子,每个椅子做一个排队的请求线程
在这里插入图片描述
在这里插入图片描述
共享型的还是独占型的

在这里插入图片描述

1,即排队在Node里的线程不想排了,
-2:即后续线程需要被唤醒
-3:线程正在condition里面等待
-3:传播、广播、一块儿的全部通知
在这里插入图片描述

Node这个内部类的成员变量,代表Node里面线程的等待状态,其取值不同,后面的出队入队也就跟着受影响
在这里插入图片描述
当前Node节点的前置、后置节点,坐Node里的线程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10分钟利用宝塔面板在阿里云服务器部署个人网页

目录 1、申请阿里云服务器 2、更换镜像(可选) 3、远程链接阿里云服务器安装宝塔面板 4、开放安全组 5、宝塔面板上传项目文件 1、申请阿里云服务器 购买链接->阿里云服务器购买 个人购买的就是这款,比较经济合算,而且2核…

HTTP 404错误:页面未找到,如何解决

在互联网上浏览时,偶尔会遇到“HTTP 404错误:页面未找到”的提示。这通常意味着用户尝试访问的网页不存在或无法找到。本文将探讨HTTP 404错误的原因以及如何解决这个问题。 一、HTTP 404错误的原因 HTTP 404错误可能是由多种原因引起的。以下是一些常…

线程安全集合类

文章目录 1. ConcurrentHashMap2. LinkedBlockingQueue 阻塞队列3. ConcurrentLinkedQueue4. CopyOnWriteArrayList JDK1.7 hashmap采用数组加链表头插的方式,在扩容时会出现循环死链问题,A->B->C扩容后C->B->A AB BA出现循环死链。 1. Conc…

《opencv实用探索·十九》光流法检测运动目标

前言 光流法(Optical Flow)是计算机视觉中的一种技术,用于估计图像中相邻帧之间的像素位移或运动。它是一种用于追踪图像中物体运动的技术,可以在视频中检测并测量物体的运动轨迹。 光流的直观理解: 光流是一个视频中两…

ubuntu-c++-可执行模块-动态链接库-链接库搜索-基础知识

文章目录 1.动态链接库简介2.动态库搜索路径3.运行时链接及搜索顺序4.查看可运行模块的链接库5.总结 1.动态链接库简介 动态库又叫动态链接库,是程序运行的时候加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态…

upload-labs笔记

简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。 文件上传漏洞是指: Web 服务器允许用户将文件上传至其…

[Unity]关于Unity接入Appsflyer并且打点支付

首先需要去官方下载Appsflyer的UnityPackage 链接在这afPackage 然后导入 导入完成 引入此段代码 using AppsFlyerSDK; using System.Collections; using System.Collections.Generic; using UnityEngine;public class AppflysManager : MonoBehaviour {public static App…

JMeter逻辑控制器

JMeter逻辑控制器 一、IF控制器1、作用2、步骤 二、循环控制器1、作用2、步骤3、线程组和循环控制器的区别? 三、ForEach控制器1、作用2、步骤 一、IF控制器 1、作用 **控制下面的测试元素是否执行**2、步骤 添加线程组用户定义的变量添加if控制器,判断…

VBA_MF系列技术资料1-242

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

C++之模板

目录 泛型编程 模板 函数模板 函数模板的实例化 隐式实例化 显示实例化 类模板 我们知道STL(标准模板库)是C学习的精华所在,在学习STL之前我们得先学习一个新的知识点-------模板。那么模板究竟是什么呢?围绕着这个问题&a…

java全栈体系结构-架构师之路(持续更新中)

Java 全栈体系结构 数据结构与算法实战(已更)微服务解决方案数据结构模型(openresty/tengine)实战高并发JVM虚拟机实战性能调优并发编程实战微服务框架源码解读集合框架源码解读分布式架构解决方案分布式消息中间件原理设计模式JavaWebJavaSE新零售电商项…

使用广播星历进行 GPS 卫星位置的计算

目录 1.计算卫星运动的平均角速度 n 2.计算观测瞬间卫星的近地点角 3.计算偏近点角 4.计算真近点角 f 5.计算升交角距 6.计算摄动改正项 7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置 9.计算观测瞬间升交点的经度 L 10.计算卫星在瞬时地球坐标系中的位置 11.…

Matlab simulink PLL学习笔记

本文学习内容:【官方】2022小迈步之 MATLAB助力芯片设计系列(一):电路仿真与模数混合设计基础_哔哩哔哩_bilibili 所用规格书:https://store.skyworksinc.com/datasheets/skyworks/sky73134_11.pdf 本文所用simulink…

【无标题】创新蓄势!安全狗多项技术获颁专利

近日,安全狗《一种网络安全监测方法、终端设备及存储介质》、《一种恶意进程风险等级评估方法、终端设备及存储介质》等多项专利顺利通过了国家知识产权局的相关审核认证,并获得了发明专利证书。 厦门服云信息科技有限公司(品牌名&#xff1a…

Mistral AI发布开放权重的高质量SMoE模型Mixtral 8x7B

🦉 AI新闻 🚀 开源MoE大模型震惊开源社区 摘要:上周末,Mistral开源了一款震惊开源社区的MoE大模型。MoE是一种神经网络架构设计,能够提升大语言模型的性能。通过使用MoE,每个输入token都可以动态路由到专…

【AutoDL】使用云服务器跑深度学习代码

一、AutoDL租用服务器 1.选用服务器 1.算力市场 租用服务器,选择自己心仪的服务器 2.镜像 可以选择一些基础的镜像,社区镜像里是git上有的环境。 3.上传文件 在文件存储中,选择上传的区,在右边点击上传,选择自己的文…

羊大师提问羊奶养胃,你知道吗?

近年来,人们对于健康的关注逐渐增加,养生已经成为一种时尚。养胃是其中一种重要的养生方式,而羊奶则是备受关注的一种养胃饮品。那么问题来了,羊奶真的能够养胃吗? 羊奶是一种营养丰富的乳制品,与牛奶相比…

记录 | docker报错could not select device driver ““ with capabilities: [[gpu]].

ubuntu18.04 上启动 docker start 报错: could not select device driver “” with capabilities: [[gpu]]. docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]]. ERRO[0005] error waiting for container: con…

如何在 JavaScript 中实现任务队列

任务队列的概念 任务队列就是存放任务的队列,队列中的任务都严格按照进入队列的先后顺序执行。 在前一条任务执行完毕后,立即执行下一条任务,直到任务队列清空。 任务队列的基本执行流程如下: 设置任务队列并发数; …

怎么制作GIF动图?教你这几个简单方法

怎么制作gif动图?GIF动图是一种非常有趣且实用的图片格式,它能够以短小精悍的方式展示动画效果,因此在社交媒体和聊天应用中备受追捧。本文将向您介绍几种制作GIF动图的方法,让您轻松制作出自己的动图。 GIF动图制作方法一&#x…