位置: 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)

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

  • 驰为v9平板电脑刷机包(驰为v9)(驰为hi9plus平板测评)

    驰为v9平板电脑刷机包(驰为v9)(驰为hi9plus平板测评)

  • 苹果12输入法手写怎么设置(苹果12输入法手写设置在哪里)

    苹果12输入法手写怎么设置(苹果12输入法手写设置在哪里)

  • qq音乐跟听对方会知道吗(qq音乐跟听对方状态无法跟听)

    qq音乐跟听对方会知道吗(qq音乐跟听对方状态无法跟听)

  • word右边对不齐怎么办(word右边对不齐格式怎么改)

    word右边对不齐怎么办(word右边对不齐格式怎么改)

  • wps怎样替换文字(wps2019怎么替换文字)

    wps怎样替换文字(wps2019怎么替换文字)

  • 二手显示器去哪买(二手显示器去哪里卖)

    二手显示器去哪买(二手显示器去哪里卖)

  • esim虚拟卡是什么意思(esim虚拟卡是什么)

    esim虚拟卡是什么意思(esim虚拟卡是什么)

  • 三星手机下载软件安装不了怎么办(三星手机下载软件的app叫什么)

    三星手机下载软件安装不了怎么办(三星手机下载软件的app叫什么)

  • 计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

    计算机指令中规定该指令执行功能的部分称为(计算机指令中规定执行操作功能的是)

  • 微信可以实名认证几个(微信可以实名认证几个账号)

    微信可以实名认证几个(微信可以实名认证几个账号)

  • 淘宝购买记录删除后还能查询么(淘宝购买记录删除了怎么找回)

    淘宝购买记录删除后还能查询么(淘宝购买记录删除了怎么找回)

  • 抖音为什么不能一次性赞所有作品(抖音为什么不能微信支付钱了呢)

    抖音为什么不能一次性赞所有作品(抖音为什么不能微信支付钱了呢)

  • 知乎为什么不能复制(知乎为什么不能发布文章)

    知乎为什么不能复制(知乎为什么不能发布文章)

  • vivo5g手机有哪些型号(vivo手机有哪几个系列)

    vivo5g手机有哪些型号(vivo手机有哪几个系列)

  • 微信注销对方还有聊天记录吗(微信注销对方还能收到信息吗)

    微信注销对方还有聊天记录吗(微信注销对方还能收到信息吗)

  • 天猫精灵app找不到设备(天猫精灵app不能控制天猫精灵吗)

    天猫精灵app找不到设备(天猫精灵app不能控制天猫精灵吗)

  • 7p内存都有多大的(iphone 7p内存多大)

    7p内存都有多大的(iphone 7p内存多大)

  • 手机怎么复制网页链接(手机怎么复制网址到浏览器打开)

    手机怎么复制网页链接(手机怎么复制网址到浏览器打开)

  • set协议和ssl协议的异同(set协议比ssl协议安全吗)

    set协议和ssl协议的异同(set协议比ssl协议安全吗)

  • 小米Max2屏幕是LCD还是OLED(小米max2屏幕参数)

    小米Max2屏幕是LCD还是OLED(小米max2屏幕参数)

  • 腾讯为什么不能投屏(腾讯为什么不能下载电视剧)

    腾讯为什么不能投屏(腾讯为什么不能下载电视剧)

  • 好用的5款火狐浏览器必备插件,每一款都很实用(火狐十大必用插件)

    好用的5款火狐浏览器必备插件,每一款都很实用(火狐十大必用插件)

  • 帝国cms收录好吗(帝国cms使用手册)

    帝国cms收录好吗(帝国cms使用手册)

  • 企业纳税人是什么
  • 收到投资款要交企业所得税吗为什么
  • 印花税申报缴纳错误,怎么办
  • 横幅属于什么发票范围
  • 差旅费用什么记账凭证
  • 小微企业减免所得税额是怎么算出来的
  • 2019一般纳税人新政策
  • 收购公司财务如何管理
  • 全年一次性奖金税收计算器
  • 房地产土地使用税已售面积如何减
  • 招待用烟的会计处理
  • 投资项目的资本金的认缴
  • 企业贷款银行罚息可以减免吗?
  • 企业短期贷款进什么科目
  • 普通发票开票人为管理员是否可以报销?
  • 固定资产进项税额怎么抵扣
  • 税收分类编码格式
  • 软件服务类企业
  • 个人所得税违约怎么查询
  • 购入增值税税控系统专用设备为什么全额计入固定资产
  • 上缴国家利润应计入什么会计分录?
  • 销项税月底还是年底结0
  • 这个月只有销项没有进项怎么申报
  • 采购材料的运费怎么做分录
  • 预付账款属于资产性质的账户
  • 房租发票需要缴房产税吗
  • 今年利润弥补以后怎么算
  • 公司购买电器的账务处理
  • 工业园租金大概是多少
  • 发送文件桌面上显示不出来
  • 非累积带薪缺勤什么时候确认
  • 农产品销售税收优惠政策
  • 房产证办理流程图
  • 政府财政会计核算基础是什么
  • 出口货物视同内销征税的会计核算
  • 离职后原单位不给开离职证明
  • 公司注销后所欠债怎么办
  • php操作mysql数据库
  • 未取得专用发票详细原因怎么写
  • php添加
  • html列表去掉点
  • web-inf lib
  • 蓝桥杯大赛2021
  • 企业的借款利息可能计入哪些账户
  • python中的函数库
  • 买车哪些费用可以计入固定资产
  • 什么叫生活补助
  • 固定资产低于净值出售会计处理
  • 固定资产相关业务
  • 开出去的发票没有进项发票如何核算成本?
  • 管理费用明细科目设置和核算需要注意哪些问题
  • 购买税控盘用银行抵扣吗
  • 非同一控制下企业合并发生的审计费
  • 股权投资如何记账
  • 一般纳税人企业所得税多久申报一次
  • 企业的未分配利润属于什么科目
  • sqlserver清空所有表数据
  • ubuntu xenial
  • centos备份文件夹
  • 如何用U盘安装新系统
  • mtr.exe
  • linux必知必会
  • 电脑系统脚本错误
  • 什么是从零开始
  • java程序员练手项目
  • cocos2d怎么用
  • 猫的猫的视频
  • document.getElementByTagName
  • jquery注释有哪几种
  • php监控源码
  • python中用input()函数接收到的数据为
  • linux中tar命令
  • jQuery插件库
  • 读取带敏感字符的行的批处理
  • 安卓手机图片缓存在哪
  • 2020年上海税务跨区迁移很麻烦吗
  • 贵州电子税务局app下载
  • 政府征用土地社保补偿标准
  • 甘肃省国家税务局
  • 电脑上装什么软件开税票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设