位置: IT常识 - 正文

并发基础之AQS(并发操作的定义)

编辑:rootadmin
并发基础之AQS

目录

什么AQS

AQS原理

重点1:CLH队列​

重点2:state 状态

AQS 两种资源共享方式

1) Exclusive(独占)

2) Share(共享)

AQS 模板方法运用

补充知识CAS

CAS的优点

CAS的缺点

缺点解决办法

总结


什么AQS

推荐整理分享并发基础之AQS(并发操作的定义),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:并发api,并发操作的定义,并发设计,并发操作的三类问题,并发算法,并发算法,并发技术,并发的基础,内容如对您有帮助,希望把文章链接给更多的朋友!

AQS是位于java.util.concurrent.locks 包下的 AbstractQueuedSynchronizer类,是构建同步器和锁的基础框架。我们可以通过继承AbstractQueuedSynchronizer 创建自己的同步器。比如我们常用的JUC并发包下面的CountDownLatch、ReentrantLock、Semaphore等等都是源于AQS实现的并发工具类。

AQS原理

核心思想是多个线程访问共享资源,如果一个线程发现共享资源没有被占用,则将资源设定为锁定状态且当前线程设为占用线程,如果一个线程发现共享资源已经被占用,则需要等待占用线程释放资源,当然当占用线程释放资源的时候AQS会通知其他等待线程进行资源抢占。在AQS实际源码中是通过state 状态在标识资源是否占用,通过CLH FIFO虚拟双向队列来实现将最近的等待线程放在队列末尾。

重点1:CLH队列

如图所示CLH是一个虚拟的双向队列,是通过state的值实现线程等待排序在队列末尾。队列head 头部是当前资源占用工作线程,node1-node n 则是资源被锁定后等待的线程节点。在实际的资源占用过程中,根据是否公平锁来确定是顺序占用资源和抢占式占用资源。

重点2:state 状态

如上图所示,线程获取资源是否被占用是通过获取 state 状态来实现。AQS源码已经给出获取、设置、通过CAS修改state 的方法。此时我们可以理解为:

 1、线程获取state 发现为 0 ,说明没有线程占用则占用该资源,并通过CAS将state 置为 1

2、如果该线程有重入的情况则继续增加state 的值,重入几次就增加几次

3、线程出方法则需要释放state值,也就是减少state

4、当state值为0 的时候标识线程执行完毕解除占用,此时AQS唤醒其他线程可以占用资源

AQS 两种资源共享方式1) Exclusive(独占)

只有一个线程能执行,如 ReentrantLock。又可分为公平锁和非公平锁,ReentrantLock 同时支持两种锁。根据ReentrantLock定义,我们可知公平锁是根据队列的等待顺序占用资源,非公平锁是所有的等待线程抢占资源。

2) Share(共享)

运行多个线程对资源共享,比如JUC并发工具CountDownLatch、Semaphore等都是运行多个线程访问资源。

AQS 模板方法运用并发基础之AQS(并发操作的定义)

AQS内置很多的操作方法,比如获取锁 tryAcquire()、释放锁 tryRelease()、超时获取tryAcquireNanos()、响应中断 acquireInterruptibly()等操作方法

在实际的运用过程中,我们可以直接继承AQS从而轻易的获取这些方法来实现我们的同步器。

当前JUC下的并发工具类都是基于AQS来实现自己的功能的,我们现在来鉴赏一下。

比如可重入锁ReentrantLock,我们进入源码查看,ReentrantLock内部类继承AQS:

我们ReentrantLock超时获取锁/释放锁也都是调用AQS超时获取锁/释放锁的方法:

当然其他对资源状态和队列的操作方法都是基于AQS实现的,对于JUC中其他的并发工具类也是如此,都是基于AQS实现。

补充知识CAS

CAS是Compare and Swap 的缩写,也就是比较和替换,是JUC最核心最基础的理论。原理是基于三个数据 主存值V、线程副本值A、需要修改为值B。当且仅当主存值V等于线程副本值A的时候,才能将数据修改为B。

CAS的优点

CAS是乐观锁,且一直自旋等待锁,所以性能很高。

CAS的缺点

ABA问题,如果我们先将值C修改为D,再修改为C,CAS会认为此数据没有修改。

缺点解决办法

1、加版本号

2、JAVA JUC atomic下提供AtomicStampedReference包装类

总结

AQS是位于java.util.concurrent.locks 包下的 AbstractQueuedSynchronizer类,是构建同步器和锁的基础框架。JAVA JUC并发包下的工具类都是基于AQS实现,其原理都是通过state状态来确定线程是否占用资源,未拿到锁的线程则放置在CLH虚拟双向队列末尾,后续通过AQS通知抢占资源。

本文链接地址:https://www.jiuchutong.com/zhishi/300110.html 转载请保留说明!

上一篇:【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫(_ html)

下一篇:人工智能助力古彝文识别,推动传统文化传承(人工智能助力中国创新发展)

  • 水滴筹怎么查询某个病人(水滴筹怎么查询捐款记录)

    水滴筹怎么查询某个病人(水滴筹怎么查询捐款记录)

  • 三相负载根据什么原则作星形或三角形连接(三相负载根据什么条件作星型或三角连接)

    三相负载根据什么原则作星形或三角形连接(三相负载根据什么条件作星型或三角连接)

  • 秘乐短视频怎么注销账号(秘乐短视频怎么做任务)

    秘乐短视频怎么注销账号(秘乐短视频怎么做任务)

  • 小米8se充电提示充电口过热(小米8充电提示灯一直闪)

    小米8se充电提示充电口过热(小米8充电提示灯一直闪)

  • 怎么取消腾讯大王卡订单(怎么取消腾讯大王卡超级会员)

    怎么取消腾讯大王卡订单(怎么取消腾讯大王卡超级会员)

  • p30pro曲面屏眼睛易疲劳(p30pro曲面屏误触问题怎么解决)

    p30pro曲面屏眼睛易疲劳(p30pro曲面屏误触问题怎么解决)

  • 支付宝用手机怎么照红底照片(支付宝用手机怎么登录)

    支付宝用手机怎么照红底照片(支付宝用手机怎么登录)

  • 表格怎么把两个格子合并成一个(表格怎么把两个格子的内容合并成一个)

    表格怎么把两个格子合并成一个(表格怎么把两个格子的内容合并成一个)

  • 华硕进安全模式哪个键(华硕进安全模式哪个键win10)

    华硕进安全模式哪个键(华硕进安全模式哪个键win10)

  • 小米手环适用于苹果吗(小米手环能用来干嘛)

    小米手环适用于苹果吗(小米手环能用来干嘛)

  • 数据服务平台是什么(数据服务平台是怎么服务其他平台的)

    数据服务平台是什么(数据服务平台是怎么服务其他平台的)

  • 安卓充电头可以充苹果吗(安卓充电头可以充苹果13吗)

    安卓充电头可以充苹果吗(安卓充电头可以充苹果13吗)

  • 华为mate30pro5g什么时候上市(华为mate30pro5g什么屏幕)

    华为mate30pro5g什么时候上市(华为mate30pro5g什么屏幕)

  • 苹果手机拍视频没声音(苹果手机拍视频怎么把音乐录进去)

    苹果手机拍视频没声音(苹果手机拍视频怎么把音乐录进去)

  • wifi能看到手机的浏览内容吗(wifi能看到手机软件密码吗)

    wifi能看到手机的浏览内容吗(wifi能看到手机软件密码吗)

  • 荣耀20和20pro屏幕尺寸(荣耀20和20pro屏幕通用吗)

    荣耀20和20pro屏幕尺寸(荣耀20和20pro屏幕通用吗)

  • switch主机模式怎么调音量

    switch主机模式怎么调音量

  • 滴滴如何更换实名认证(滴滴如何更换实名认证信息)

    滴滴如何更换实名认证(滴滴如何更换实名认证信息)

  • 华为mate30能用谷歌吗(华为mate30能用谷歌服务吗)

    华为mate30能用谷歌吗(华为mate30能用谷歌服务吗)

  • ie浏览器在电脑上哪找(ie浏览器在电脑哪里)

    ie浏览器在电脑上哪找(ie浏览器在电脑哪里)

  • dota2(dota2梦幻联赛s20)

    dota2(dota2梦幻联赛s20)

  •  oppo怎么解除禁止安装权限(oppo怎么解除禁止自动读取验证码)

    oppo怎么解除禁止安装权限(oppo怎么解除禁止自动读取验证码)

  • 监控怎么连接手机(监控怎么连接手机远程)

    监控怎么连接手机(监控怎么连接手机远程)

  • 台式电脑死机(台式电脑死机画面卡住不动)

    台式电脑死机(台式电脑死机画面卡住不动)

  • 电脑屏幕花了条纹形状(电脑屏幕花了条纹形状并且分辨率变低)

    电脑屏幕花了条纹形状(电脑屏幕花了条纹形状并且分辨率变低)

  • 在Win7中,电脑无法识别光驱怎么办?(在windows7操作具有什么特点)

    在Win7中,电脑无法识别光驱怎么办?(在windows7操作具有什么特点)

  • 开启自动备份注册表

    开启自动备份注册表

  • 若依框架文档开发手册----开发中常用功能模块(若依框架搭建)

    若依框架文档开发手册----开发中常用功能模块(若依框架搭建)

  • 一般纳税人结转税额怎么做会计分录
  • 一般纳税人销售货物税率
  • 所得税季报季末人数怎么计算
  • 房地产老项目简易计税方法备案
  • 给员工代缴社保工资是否违反劳动法
  • 负债类科目有借方余额吗
  • 2016 营改增 对建筑企业影响
  • 公司开办费有哪些
  • 未达账项怎么做会计分录
  • 专票红冲后还需重新开票吗
  • 营业收入包括其收入吗
  • 预交增值税附加税费减免吗
  • 商业保险可以税前扣除多少
  • 税局会例行检查吗
  • 零申报的企业
  • 新公司开业的祝福语
  • 上个月没有报个税这个月一起报
  • 专项资金需要交印花税吗
  • 在建工程印花税计税依据
  • 免税销售额需要价税分离吗
  • 增值税普票可以抵扣税吗
  • 公司新增注册资本
  • 发票金额小于之前的金额
  • 手机文件打开方式怎么设置默认
  • 财务报表包括哪几个表
  • 事业单位在建工程转固定资产的账务处理
  • ecshop怎么用
  • PHP:session_register()的用法_Session函数
  • 微软win11预览版
  • 资产和负债的计税基础金额的确认思维导图
  • uniapp cover-view
  • php进程数量怎么决定
  • PHP:imagettftext()的用法_GD库图像处理函数
  • 一场雷雨还是一阵雷雨
  • php数据库编程
  • AI:ModelScope(一站式开源的模型即服务共享平台)的简介、安装、使用方法之详细攻略
  • 页面白屏可能原因前端
  • laravel框架最新版本
  • php获取年月日
  • eclipse php wamp配置教程
  • css过渡动画属性
  • 深度学习参数初始化(二)Kaiming初始化 含代码
  • db2diag命令
  • python按行读入
  • tsop封装
  • 固定资产报废如何记账
  • 核销发生的坏账损失
  • 有留抵税额可以注销吗
  • 哪些凭证是免纳税的
  • 金蝶余额调节表勾对日期什么意思
  • sqlserver表与表之间怎么关联
  • 一般纳税人工程劳务发票税率是多少
  • 固定资产计提折旧表
  • 网上交税已经缴费怎么退
  • 借支单是会计算做还是出纳做
  • 一般纳税人购买汽车会计分录
  • 外购的商品用于投分送
  • 房地产预售款预交税金计算
  • 全额工资和实发工资
  • 同比增长率环比增长率怎么算
  • 跨两年的发票可以冲红吗
  • 小规模其他业务收入交多少税率
  • 餐饮费与业务招标的关系
  • mysql迁移方案
  • centos 进程查询
  • freebsd操作命令
  • VMware虚拟机安装Ubuntu22.04详细图文教程 原
  • 怎么恢复Windows xp蓝天白云壁纸
  • ps是什么文件
  • windows7无法继续安装
  • javascript字面量
  • 多媒体播放器使用方法
  • html气泡效果
  • unity3d怎么全屏
  • 表单中的单选框
  • 广东税务人工服务
  • ca登陆
  • 广州市地方税务局规费服务中心
  • 进项税计提和上交会计分录
  • 软件企业专项审计
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设