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

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

  • 向境外企业支付利息代扣代缴
  • 组成计税价格的公式
  • 外部审计内容是什么
  • 计算企业所得税可以扣除的项目有
  • 产品未含税价格怎么算
  • 政府基金如何开票
  • 企业外部风险包括
  • 提供有形动产租赁服务适用税率为13%
  • 外汇结款怎么办理
  • 基金公司管理费收入怎么入账
  • 税费种认定功能在哪里
  • 解析居民企业非货币性资产对外投资政策
  • 抵扣联和发票联算一张发票吗
  • 食堂购买蔬菜计算公式
  • 组织员工出游注意事项
  • 消耗性生物资产如何结转成本
  • 无票收入科目
  • 个税系统添加人员出现证件号码不符合一般规则
  • 应收账款补贴
  • 域名服务费属于什么会计科目
  • 招财树的养殖方法
  • 解决问题
  • 购买车辆的会计分录该怎样做
  • 亚士顿森林薄雾日出,英国东萨塞克斯郡 (© Tim Stocker Photography/Getty Images)
  • 企业类型变更是什么意思
  • php7.3安装
  • php生成二维码海报
  • 销售多余材料的收入属于收入吗
  • vue3动态路由权限
  • javaweb项目开发流程
  • springboot比spring做了哪些改进
  • 点云入门
  • 认缴制情况下 公司一定要出资到位再注销吗
  • 应付工资怎么记账
  • mongodb创建库
  • 成本会计制造费用核算的内容
  • 未实际支付的成本能否列支
  • Postgre数据库Insert 、Query性能优化详解
  • 个人所得税劳务所得
  • 劳动仲裁的调解书可以撤销吗
  • 无形资产摊销年限按法律规定还是企业估计
  • 固定资产清理是什么账户
  • 资产减值准备是资产的备抵科目吗
  • 期末留抵的进项税可以计入成本吗
  • 弱电工程怎么入账
  • 应收账款多久收不回来作为坏账
  • 年中未分配利润
  • 车辆保险费算什么费用
  • 转出未交增值税借方余额怎么处理
  • 进项税转出税额
  • 增加的实收资本印花税
  • 主营业务收入的t型账户怎么写
  • 非关联企业之间可以借款吗
  • 公司被冻结
  • 批发商品销售的方式有委托代销吗
  • 按不同要求分类
  • sql server触发器的编写与使用
  • 免激活合法使用的软件
  • windows server 2003 sp3
  • linux如何查询
  • 怎么用u盘装xp系统教程
  • WZCSLDR.exe - WZCSLDR是什么进程
  • centos安装lvm
  • tr linux 命令
  • 如何关闭office开机自启动
  • windows live language setting
  • 微软认为
  • 图像unit8
  • linux中gzip的用法
  • shell中echo命令详解
  • it unes
  • unity xml读取
  • javascript基础
  • before和after在句子中怎么翻译
  • 医院缴纳什么税
  • 党建工作领导小组会议
  • 山东税务申报如何网上申报
  • 资本结构不合理的公司有哪些
  • 社保在哪里缴费
  • 梦幻西游新区绿色通道多少钱
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设