Java并发编程之AQS以及源码解析
文章目录
- 概览
- 实现思路
- 实现原理
- 源自CLH锁
- AQS数据模型
- CAS操作
- 主要方法
- 自定义同步器的实现方法
- AQS定义的模板方法
- 源码解读
- 等待状态释义
- AQS获取锁的流程图
- 获取独占锁的实现
- 总结acquire的流程
- 释放独占锁的实现
- 获取共享锁的实现
- 释放共享锁的实现
- 相关问题
概览
AQS(AbstractQueuedSynchronizer)是 Doug Lea
大师创作的用来构建锁或者其他同步组件(信号量、事件等)的基础框架类。
JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Semaphore, CountDownLatch等等。
AQS本身是一个抽象类,主要的使用方法是继承它作为一个内部类。
AQS设计基于模板方法模式,开发者需要继承同步器并且重写指定的方法,将其组合在并发组件的实现中,调用同步器的模板方法,模板方法会调用使用者重写的方法。
AQS定义了一套多线程访问共享资源的同步器框架,是整个包的基石,Lock
、ReadWriteLock
、CountDowndLatch
、CyclicBarrier
、Semaphore
、ThreadPoolExecutor
等都是在AQS的基础上实现的。
实现思路
AQS内部维护一个FIFO队列来管理锁。线程会首先尝试获取锁,如果失败,则将当前线程以及等待状态等信息包成一个Node节点加到同步队列里。
接着会不断循环尝试获取锁(条件是当前节点为head的直接后继才会循环尝试),如果失败或者不是head的后继节点,则会阻塞自己,直至被唤醒;而当持有锁的线程释放锁时(或取消时),会唤醒队列中的后继线程。
更多请移驾。。。
Java并发编程之AQS以及源码解析相关推荐
- Java并发编程之AQS详解
一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...
- 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现
在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...
- 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)
一.Socket类 Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据).下面我将从源码的角度来介绍Socket类的内部原理及其方法 ...
- Java并发编程之CAS第三篇-CAS的缺点
Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...
- Java并发编程之CyclicBarrier详解
简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...
- zbb20180929 thread java并发编程之Condition
java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...
- java并发编程之4——Java锁分解锁分段技术
转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...
- Java 并发编程之美:并发编程高级篇之一-chat
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- Java 并发编程之美:并发编程高级篇之一
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
最新文章
- MySQL数据库备份之主从同步配置
- 6、单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
- HTML 按钮(button)的 disable 属性和 disable property
- c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法
- 数字信号处理基础知识之DFT、DTFT、DFS、FFT基本概念扫盲
- 美女学霸直博中科院,本科武大王者全国16强,妥妥现实版“爽文女主”!
- nginx文件类型错误解析漏洞
- 双y轴设置 颜色_项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、实时下位机数据)...
- Linux 匿名页的反向映射
- Game HDU - 5242 树链思想
- C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询
- PlaceHolder到底什么
- 21点游戏java实现
- 基于jQuery动画二级下拉导航菜单
- 网站源码获取工具 Teleport Ultra
- 运维中常用Linux命令及运维工具
- 排列图 - QCC小组活动推行知识系列介绍(三)
- 软考中的嵌入式系统设计师为什么考的人少?
- 用Python+selenium实现在全国报刊索引上搜集资料
- word批量修改交叉引用颜色
热门文章
- 小技巧之-Zombie Enable(僵尸断点)
- 二维码营销是若何在消费者之间迅速成长的
- c语言编程中 不等于怎么镖师,镖局名字牛的似乎都不牛
- 十六、关于IO流分离的内容
- 正版软件推荐 - FliTik 翻页时钟 颜值与实力并存工具软件
- simsimi 教程 java_用java实现Simsimi小黄鸡接口
- 在 Mac 上将 PDF 转换为 Word 的 10 个免费工具
- 唯一ID(UniqueID)生成算法 解析
- 汇编中 .equ 的作用
- .equ .long表示什么意思?