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

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

  • 外经证预缴税款征收率
  • 合伙企业主要缴纳的税种?
  • 租赁收入缴纳个人所得税
  • 一次性开票分期确认收入的税务文件是什么
  • 合伙企业每年费用
  • 在分公司签的合同能转到总公司吗
  • 工资算管理费用还是生产成本
  • 主营业务收入计入
  • 以前年度损益调整借贷方向
  • 房租租金收入都缴纳什么税金
  • 公司授权给公司有风险吗?
  • 应收留抵税额退税款科目怎么添加进项
  • 当月发票开错了已经红冲怎么做分录?
  • 从基本存款账户之外的银行结算账户转账存入
  • 被代持股份怎么退出
  • 公司进项销项税差异较大
  • 电子发票怎么红冲步骤视频
  • 混凝土增值税政策
  • 库存商品暂估成本多少合适
  • 应收账款周转率怎么分析
  • 企业注销个税怎样更正申报呢
  • 员工住院押金会计处理
  • 社保基数填错了 可以退款吗
  • 联想笔记本e49系列哪款好
  • linux的使用场合
  • 暗格里的秘密电视剧彩蛋百度网盘
  • 现金日记账期初余额怎么登账
  • 环评费入账的会计分录是什么啊
  • 投资收益或亏损影响营业利润吗
  • 当月交当月社保费会计分录
  • php字符串赋值
  • 应收账款周转天数减少说明什么
  • 睿因无线路由器怎么设置
  • 税务自查补税后还有风险吗
  • fall 瀑布
  • 固定资产提前报废当月计提折旧吗
  • php常用array函数
  • 对公取款
  • 以前年度支出如何计算
  • 支付厂房租赁费怎么入账
  • 累计预扣法计算并预扣预缴税款
  • 进项税额年末账务处理
  • 公益性捐赠支出纳税调整
  • python动态数据类型
  • 基于vue的开源甘特图控件
  • 成本核算的意义是什么
  • 一般纳税人简易计税方法适用情形
  • 一般纳税人的劳务公司的税率
  • 进项税准予抵扣条件有哪些
  • 存货周转率特别高说明什么
  • 内账应收应付怎么对账
  • 固定资产和无形资产折旧时间起始
  • 会计中预付账款
  • 其它权益工具投资和其他债权投资
  • 社保补贴生育津贴
  • 公司付款给个人现金
  • 最低标准买社保公积金个人缴纳多少钱
  • 预计负债可以获取利润吗
  • 建账的过程包括哪些内容
  • 环境会计的构建方法
  • 2008sql附加数据库
  • win8语言栏不见了 怎么调出来
  • 修改注册表解决画面撕裂
  • 如何使用u盘安装软件
  • mac 系统查看
  • centos查看目录空间大小
  • centos云服务器
  • 安装centos7安装位置没有磁盘
  • win8怎么系统重装系统
  • unity3d连接数据库
  • Node.js中的包管理工具是什么
  • unity3d控制物体移动
  • javascript入门教程
  • jquery删除table行
  • python中set用法
  • 寻找志同道合的小伙伴
  • 静海去天津的公交
  • 矿山占用荒山是什么意思
  • 浙江省税务局发短信是真的吗
  • 肉类零售
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设