文章目录

  • 概览
  • 实现思路
  • 实现原理
    • 源自CLH锁
    • AQS数据模型
    • CAS操作
  • 主要方法
    • 自定义同步器的实现方法
    • AQS定义的模板方法
  • 源码解读
    • 等待状态释义
    • AQS获取锁的流程图
    • 获取独占锁的实现
    • 总结acquire的流程
    • 释放独占锁的实现
    • 获取共享锁的实现
    • 释放共享锁的实现
  • 相关问题

概览

AQS(AbstractQueuedSynchronizer)是 Doug Lea 大师创作的用来构建锁或者其他同步组件(信号量、事件等)的基础框架类。

JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Semaphore, CountDownLatch等等。

AQS本身是一个抽象类,主要的使用方法是继承它作为一个内部类。

AQS设计基于模板方法模式,开发者需要继承同步器并且重写指定的方法,将其组合在并发组件的实现中,调用同步器的模板方法,模板方法会调用使用者重写的方法。

AQS定义了一套多线程访问共享资源的同步器框架,是整个包的基石,LockReadWriteLockCountDowndLatchCyclicBarrierSemaphoreThreadPoolExecutor等都是在AQS的基础上实现的。

实现思路

AQS内部维护一个FIFO队列来管理锁。线程会首先尝试获取锁,如果失败,则将当前线程以及等待状态等信息包成一个Node节点加到同步队列里。

接着会不断循环尝试获取锁(条件是当前节点为head的直接后继才会循环尝试),如果失败或者不是head的后继节点,则会阻塞自己,直至被唤醒;而当持有锁的线程释放锁时(或取消时),会唤醒队列中的后继线程。

更多请移驾。。。

Java并发编程之AQS以及源码解析相关推荐

  1. Java并发编程之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  2. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

  3. 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)

    一.Socket类 Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据).下面我将从源码的角度来介绍Socket类的内部原理及其方法 ...

  4. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  5. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  6. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  7. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  8. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  9. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

最新文章

  1. MySQL数据库备份之主从同步配置
  2. 6、单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
  3. HTML 按钮(button)的 disable 属性和 disable property
  4. c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法
  5. 数字信号处理基础知识之DFT、DTFT、DFS、FFT基本概念扫盲
  6. 美女学霸直博中科院,本科武大王者全国16强,妥妥现实版“爽文女主”!
  7. nginx文件类型错误解析漏洞
  8. 双y轴设置 颜色_项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、实时下位机数据)...
  9. Linux 匿名页的反向映射
  10. Game HDU - 5242 树链思想
  11. C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询
  12. PlaceHolder到底什么
  13. 21点游戏java实现
  14. 基于jQuery动画二级下拉导航菜单
  15. 网站源码获取工具 Teleport Ultra
  16. 运维中常用Linux命令及运维工具
  17. 排列图 - QCC小组活动推行知识系列介绍(三)
  18. 软考中的嵌入式系统设计师为什么考的人少?
  19. 用Python+selenium实现在全国报刊索引上搜集资料
  20. word批量修改交叉引用颜色

热门文章

  1. 小技巧之-Zombie Enable(僵尸断点)
  2. 二维码营销是若何在消费者之间迅速成长的
  3. c语言编程中 不等于怎么镖师,镖局名字牛的似乎都不牛
  4. 十六、关于IO流分离的内容
  5. 正版软件推荐 - FliTik 翻页时钟 颜值与实力并存工具软件
  6. simsimi 教程 java_用java实现Simsimi小黄鸡接口
  7. 在 Mac 上将 PDF 转换为 Word 的 10 个免费工具
  8. 唯一ID(UniqueID)生成算法 解析
  9. 汇编中 .equ 的作用
  10. .equ .long表示什么意思?