在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS。

本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计有清晰了解,让你迈出高并发编程的第一步。

AQS

AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。

AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,比如大家熟知的:

  • ReentrantLock
  • Semaphore
  • CountDownLatch
  • CyclicBarrier

等并发类均是基于AQS来实现的。

AQS的数据模型

AQS 使用上图的资源变量 state来表示同步状态,通过内置的 CLH FIFO 队列来完成获取资源线程的排队工作,这里会涉及到三个要素:

1.AQS的三个核心成员变量

  • 共享资源:volatile int state(代表共享状态)
  • 队头节点:head头节点
  • 队尾节点:tail尾节点

head、tail、state三个变量都是volatile的,通过volatile来保证共享变量的可见性。

2.AQS中state状态的变更是基于CAS实现的

主要有三种方法:

  • getState()
  • setState()
  • compareAndSetState()

state状态通过volatile保证共享变量的可见性,再由CAS 对该同步状态进行原子操作,从而保证原子性和可见性。

3.CLH队列(FIFO队列)

CLH队列通过内置的FIFO队列(Node来实现),来完成线程等待排队 (多线程争用资源被阻塞时会进入此队列)。

AQS资源共享方式

AQS定义两种资源共享方式:

1.独占锁Exclusive

独占模式下时,其他线程试图获取该锁将无法取得成功,只有一个线程能执行,如ReentrantLock采用独占模式。

ReentrantLock还可以分为公平锁和非公平锁:

  • 公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
  • 非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的

2.共享锁shared

多个线程获取某个锁可能会获得成功,多个线程可同时执行,如:Semaphore、CountDownLatch。

AQS的锁获取与释放原理

1.线程获取锁流程:

  • 线程A获取锁,state将0置为1,线程A占用
  • 在A没有释放锁期间,线程B也来获取锁,线程B获取state为1,表示线程被占用,线程B创建Node节点放入队尾(tail),并且阻塞线程B
  • 同理线程C获取state为1,表示线程被占用,线程C创建Node节点,放入队尾,且阻塞线程

2.线程释放锁流程:

  • 线程A执行完,将state从1置为0
  • 唤醒下一个Node B线程节点,然后再删除线程A节点
  • 线程B占用,获取state状态位,执行完后唤醒下一个节点 Node C,再删除线程B节点

更加详细的锁获取和释放过程,建议通过查看源码的方式学习AQS独占模式和共享模式下的获取锁过程。

AQS总结

本文主要介绍AQS的数据模型、CLH队列、资源共享方式、以及锁的获取与释放流程,来介绍AQS的实现原理

让大家能对AQS有一个整体的了解,只有对整体的设计方向有清晰了解,再去跟踪学习源码就会比较轻松了。

后续将详细介绍基于AQS实现的同步组件:ReentrantLock、Semaphore、CountDownLatch。

更多高并发架构专题

该资料获取方式

关注+转发后,私信我关键词 【高并发】即可获取!

高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现相关推荐

  1. Java网络编程之NIO编程(待补充)

    Java网络编程之NIO编程(待补充) 学习网站1:http://ifeve.com/java-nio-all/ 学习网站2:http://www.ibm.com/developerworks/cn/ ...

  2. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  3. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  4. mysql 高并发 响应时间_高并发,你真的了解吗?

    摘要:本文介绍高并发系统的度量指标,讲述高并发系统的设计思路,再梳理高并发的关键技术,最后结合作者的经验做一些延伸探讨. 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系 ...

  5. Java并发编程实战_一线大厂架构师整理:java并发编程实践教程

    并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序.然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系.因此 ...

  6. mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

    推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...

  7. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

  8. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  9. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程

    函数式编程和面向对象式编程 As Oracle Corporation has introduced some Functional constructs in Java SE 8, now-a-da ...

最新文章

  1. 微软发布WP SDK8.0 新增语音、应用内支付等原生API
  2. 使用Spring AOP中MethodInterceptor记录日志
  3. 每月分享github上有意思的项目
  4. python中使用pickle进行序列化
  5. 【前端】前端笔试题 [1]
  6. c语言函数调用数组_第七讲:C语言基础之函数,第二节,实现汉诺塔
  7. uva 1613——K-Graph Oddity
  8. 9203学生工具页-建议放桌面
  9. 自然场景文本检测识别技术集合(转)
  10. 阿里云短信服务bug
  11. maven3常用命令
  12. java计算机毕业设计服装连锁店后台管理系统MyBatis+系统+LW文档+源码+调试部署
  13. android 程序到手机,安卓手机怎么从电脑安装应用到手机
  14. c语言关于性别的程序,输入性别并记录男女个数还要算出男女平均年龄的c语言程序怎样写...
  15. 小程序behavior
  16. 猜数游戏(人机交互)
  17. 导入EXCEL数据更新access数据库里的信息
  18. ElementUI 文件上传传递额外参数
  19. (八)《跟我一起写Makefile》之使用函数
  20. 工程师为女朋友自制的硬核礼物

热门文章

  1. 500道Java 必备面试题答案(过后即删)
  2. IT公司刻板印象合集:程序员都秃头,商务个个是人精
  3. 云计算将会让数据中心消失?
  4. 云存储精华问答 | 如何选择云迁移策略?
  5. webview键盘自适应_黑爵毛茸茸机械键盘:感受来自治愈系的暖萌
  6. docker redis:6.2.6
  7. Docker 查看日志记录
  8. Linux7/Redhat7/Centos7 安装Oracle 12C_配置IP、系统参数_02
  9. Mysql8.0 的sql修改成 Mysql7.X的sql
  10. 1分钟 搭建xxl-job任务调度中心