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

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

  • 个税手续费返还会计分录
  • 租赁合同印花税计税依据
  • 为职工垫付的水电费应计入
  • 发票领购簿长什么样
  • 小微企业增值税起征点是多少
  • 增值税三级明细科目包括
  • 自然人系统怎么申报个人所得税
  • 从合伙企业分回的经营所得 合伙企业 个人所得税
  • 收到退所得税款的会计分录
  • 出租房屋确认收入列简易计税还是销项税
  • 发票报送失败怎么弄
  • 研发技术服务属于什么费用
  • 跨年调整会计科目怎么写
  • 计提资产减值准备金的纳税调整
  • 收回已作为坏账准备的应收账款会计分录
  • 固定资产折旧方法有几种
  • 暂估入库冲回的会计分录
  • 代驾服务费属于什么费用
  • 小规模纳税人专票开1%还是3%
  • 差旅补助是否并入工资
  • 纳税人识别号和税号是一个意思吗
  • 许可费怎么进行分类
  • 出租厂房算什么收入
  • 收到单位失业保险怎么办
  • 个人股权转让印花税在哪里申报
  • 公司没有残疾人需要缴纳残保金吗
  • 资本的不同形态
  • 房地产公司未售房产出租账务处理
  • 入库单的金额填不填价税合计
  • 小规模发票一般怎么开
  • phpfopen
  • 电脑语言栏不见了,打不出汉字
  • Vue3 入门笔记 ---- 利用Element Plus对页面进行布局划分以及实现左侧公共菜单
  • 生产成本分配表模板
  • 取得专票怎么结转销售成本
  • PHP:imagecreatefromgd2()的用法_GD库图像处理函数
  • php判断useragent
  • HTML怎么设置文本框
  • vscode简单入门
  • php实现的常规正态分解
  • 开发票如何计算税率
  • 股息和未分配利润的区别
  • 电话订票起售时间
  • 出售持有股票会计处理
  • 资产负债表中的货币资金怎么算
  • 取得增值税
  • 文章初审过了
  • 财政监制章专用收据可以税前扣除吗
  • 企业所得税放入什么科目
  • 收缩数据库日志文件对数据有影响吗
  • 研发费用的范围包括哪些
  • linux mysql 找回密码
  • 一般纳税人简易计税方法适用情形
  • 企业主营业务收入科目下的余额应转入的科目是
  • 一般纳税人增值税减免政策2023
  • 残保金账务处理会计科目
  • 原材料报废卖掉会计分录
  • 现金折扣可以扣除吗
  • 税务机关多收税款几年可以要求退回
  • 河道管理费是附加税吗
  • 备用金怎么计入明细账
  • 股份有限公司向股东借款
  • 差旅费的会计处理
  • 小企业购进商品怎么入账
  • 营业收入就是开票的不含税金额吗
  • 滴滴普票可以计算抵扣吗
  • 营业收入是利润总额吗
  • 电脑系统2003
  • explorer.exe进程在哪
  • service.exe是什么
  • linux rpm包位置
  • win7开机chkdsk
  • win7无网激活
  • firefox下rowspan+border+border-collapse的bug
  • Unsolved bug in fltk-1.1.10/src/filename_list.cxx for scandir --已解决!
  • Linux中获取某个进程的系统调用以及参数(故障排查案例)
  • python爆破脚本
  • shell脚本实现批量登录并执行命令
  • Android SQLite, KopDB 框架学习1——使用
  • 细说javascript
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设