4.从AbstractQueuedSynchronizer(AQS)说起(3)——AQS结语
前两节的内容《2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放》 、《3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放》对AQS同步器已经有了一个大致的了解,从独占模式和共享模式来解析了AQS的两个基本方面,一个是同步状态的获取,另外一个是同步状态的释放,这是AQS最基本的特性,前面两节都是以阻塞的形式获取同步状态,但实际上AQS还能超时等待获取同步状态,或者非阻塞的方式获取同步状态。
以下是AQS锁定义的所有情况下同步状态的获取与释放(粗体为前两节已经讨论过),有了前两篇的解析,实际上剩余的方法几乎已经是换汤不换药。在这里就不再代码的具体分析,而我希望是在真正解读其子类的时候再返回来解析。
|
AbstractQueuedSynchronizer |
|
|
public final void acquire(int arg) |
独占模式下阻塞获取同步状态,成功获取则返回,失败则进入同步队列等待。(例:ReentrantLock.lock) |
|
public final void acquireInterruptibly(int arg) |
该方法与acquire类似,唯一不同的是如果当前线程被中断,该方法会抛出InterruptedException并返回,也就是说如果当前线程不被中断则和acquire一样。(例:ReentrantLock.lockInterruptibly) |
|
public final boolean tryAcquire(int arg, long nanosTimeOut) |
该方法在acquireInterruptibly的基础上增加了超时限制,如果当前线程在超时时间内获取到同步状态则返回true,获取到则返回false。(例:ReentrantLock.tryLock) |
|
public final acquireShared(int arg) |
共享模式下阻塞获取同步状态,成功获取则返回,失败则进入同步队列。(例:ReentrantReadWriteLock.unlock) |
|
public final acquireSharedInterruptibly(int arg) |
与acquireShared不同是此方法响应中断,与acquireInterruptibly类似,不同是的此方法是在共享模式下。(例:ReentrantReadWriteLock.lockInterruptibly) |
|
public final tryAcquireSharedNanos(int arg, long nanos) |
在acquireSharedInterruptibly基础上增加了超时限制,同样是在共享模式下。(例:ReentrantReadWriteLock.tryAcquireSharedNanos) |
|
public final boolean release(int arg) |
独占模式下释放同步状态,释放之后会将同步队列中的第一个包含的线程唤醒 |
|
public final boolean releaseShared(int arg) |
共享模式下释放同步状态 |
以下是AQS中给提供的获取同步状态等相关的方法:
|
AbstractQueuedSynchronizer |
|
|
public final boolean hasQueuedThreads() |
同步队列中是否有等待线程。 |
|
public final boolean hasContended() |
查询是否其他线程也曾争则获取此同步器,也就是说acquire是否已经阻塞,是则返回true。 |
|
public final Thread getFirstQueuedThread() |
返回当前同步队列中的第一个线程,米有则返回null。 |
|
public final boolean isQueued(Thread thread) |
线程是否已经在等待队列中,是则返回true。 |
|
final boolean apparentlyFirstQueuedIsExclusive() |
(包级可见)同步队列中第一个等待节点是否为独占模式 |
|
public final boolean hasQueuedPredecessors() |
查询是否有其他线程获取同步状态的时间大于当前线程,用于公平锁的实现。 |
|
public final int getQueueLength() |
返回同步队列的估计长度,该方法用于监视系统状态,而非同步控制。 |
|
public final Collection<Thread> getQueuedThreads() |
获取同步队列线程集合,同样是一个估计值。 |
|
public final Collection<Thread> getWaitingThreads(ConditionObject condition) |
获取在等等队列中的线程集合,估计值。 |
|
public final Collection<Thread> getExclusiveQueuedThreads() |
获取同步队列中独占模式线程集合,估计值。 |
|
public final Collection<Thread> getSharedQueuedThreads() |
获取同步队列中共享模式线程集合,同估计值。 |
|
final isOnSyncQueue(Node node) |
当前节点是否在sync等待队列中 |
以上方法或多或少再其子类有用到,具体的实现都不复杂,我们在这里也不对其一一做出分析,而是在具体分析到AQS的子类时,我们再回过头来看方法的实现。
最后我们再来看看子类可以重写的方法,这些方法在前两节中有提到过:
|
AbstractQueuedSynchronizer |
|
|
protected boolean tryAcquire(int arg) |
子类可实现在独占模式下获取同步状态的具体方法。 |
|
protected boolean tryRelease() |
子类可实现在独占模式下释放同步状态的具体方法。 |
|
protected int tryAcquireShared(int arg) |
子类可实现在共享模式下获取同步状态的具体方法。 |
|
protected int tryReleaseShared() |
子类可实现在共享模式下释放同步状态的具体方法。 |
|
protected boolean isHeldExclusively() |
当前同步器是否在独占模式下被线程占用,一般表示该方法是否被当前线程所独占。 |
Java并发包的第一个源码解读并不顺利,起初是想以Lock开头,但发现AQS不甚了解,继而决定从AQS入手。而真正从AQS入手过后发现很多原理及方法并不熟悉,又想从其子类之一ReentrantLock$Sync由下往上,但发现还是动不了脑子和笔,无奈陷入了停滞。最终决定由上往下进行解读,有的地方需要子类或者其他类做解释的时候要么跳过,要么一句话带过。在查找AQS的相关资料时,我发现其实源代码就是一个很好的“老师”,作者实际上已经将其实现的原理和过程以及设计都已经描述在其中,但又出现一个问题,注释都是英文,很多地方看不懂。网上有关AQS的解读都没有成套成体系的资料,于是开始将注意力转向书籍,先是查阅《Java并发编程实战》也许对于外国人来说源码中注释里已经写得很清楚的东西就不用再阐述了,而我正是需要最最基础的“注释翻译”。再查阅《Thinking in Java》更是没有我想要的东西,再看看其他的书均没有。突然想起有一个国人写的书《Java并发编程的艺术》,看了看目录决定入手,这本书的确对我入门Java并发包的源码有很大的帮助,尽管它不想《Java并发编程实战》这么经典、耐看,但是它作为入门级却有很大的帮助,文中的不少分析就是结合这本书以及源码才让我得以比较顺利的开展第一个Java并发包的AbstractQueuedSynchronizer源码解读。源码的阅读也许就是这样,跳过来跳过去,这个类继承,那个类实现,相互交叉耦合,很难一下就能读懂作者所要想表达的意思,坚持读下去,一定会豁然开朗。
4.从AbstractQueuedSynchronizer(AQS)说起(3)——AQS结语的更多相关文章
- Java并发框架——AQS之如何使用AQS构建同步器
AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制.AQS的设计必须考虑把复杂 ...
- Java并发框架——AQS之怎样使用AQS构建同步器
AQS的设计思想是通过继承的方式提供一个模板让大家能够非常easy依据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即能够实现不同的锁机制. AQS的设计必须考 ...
- 别走!这里有个笔记:图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)
前言 AbstractQueuedSynchronizer 抽象队列同步器,简称 AQS .是在 JUC 包下面一个非常重要的基础组件,JUC 包下面的并发锁 ReentrantLock CountD ...
- 2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放
首先我们从java.util.concurrent.locks包中的AbstraceQueuedSynchronizer说起,在下文中称为AQS. AQS是一个用于构建锁和同步器的框架.例如在并发包中 ...
- AQS框架源码分析-AbstractQueuedSynchronizer
前言:AQS框架在J.U.C中的地位不言而喻,可以说没有AQS就没有J.U.C包,可见其重要性,因此有必要对其原理进行详细深入的理解. 1.AQS是什么 在深入AQS之前,首先我们要搞清楚什么是AQS ...
- 8.初识Lock与AbstractQueuedSynchronizer(AQS)
1. concurrent包的结构层次 在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们对并发编程的掌握更加透彻也会大大提升我们队并发编程技术的 ...
- AbstractQueuedSynchronizer(AQS)源码解析
关于AQS的源码解析,本来是没有打算特意写一篇文章来介绍的.不过在写本学期课程作业中,有一门写了关于AQS的,而且也画了一些相关的图,所以直接拿过来分享一下,如有错误欢迎指正. ...
- 初识Lock与AbstractQueuedSynchronizer(AQS)
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础
AbstractQueuedSynchronizer(以下简称AQS)的内容确实有点多,博主考虑再三,还是决定把它拆成三期.原因有三,一是放入同一篇博客势必影响阅读体验,而是为了表达对这个伟大基础并发 ...
随机推荐
- Akari谜题(关灯问题)的开灯解法
提高解时预处理的速度 本方法的结果是得到满足所有黑色有数字方块的一个带有未照亮的块的可能解集. 解集大小为 4~(3号块数量+1号块数量)+6~(2号块数量)-灯互相照射到的解的集合.集合中的灯为黄色 ...
- Windows 10 系统Microsoft Edge的使用手册
Windows 10 默认浏览器(Edge)使用手册 体验网络有了一种新的方法.只有在 Windows 10 上才能找到它. 下面详细介绍一下Edge浏览器的使用规范: 一.打开Windows10系统 ...
- SPOJ - VISIBLEBOX [multiset的使用]
tags:[STL][sort][贪心]题解:做法:先对数组a进行排序,再将数组a从头到尾扫一遍,使用multiset维护最小值,如果,即将放入集合的数字>=最小值的两倍,那我们就删除掉多重集合 ...
- Excel公式-求最低价网站名字
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- macOS平台下虚拟摄像头的研发总结
一.背景介绍 虚拟摄像头,顾名思义,就是利用软件技术虚拟出一个摄像头硬件设备供用户使用.当我们需要对视频图像进行处理再输出时,虚拟摄像头就具备非常大的价值了.关于如何在Windwos上实现一个虚拟设备 ...
- java小题:福尔摩斯的约会
原题地址:https://www.nowcoder.com/pat/6/problem/4040 防止广告嫌疑,原题为: 题目描述 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485 ...
- DAM的使用结合串口和中断以及GPIO。
DAM的使用结合串口和中断以及GPIO. 当我学到DMA这章的时候就意味着我已经学完了,GPIO里的LED,按键,还有就是串口发送数据. 那么下面就来总结下前段时间所学的知识(因为接下来有断时间我是没 ...
- 对InvokeRequired的理解
if (listBox1.InvokeRequired) //当有新工作进程访问控件时InvokeRequired为True ...
- 一条SQL搞定信息增益的计算
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 周东谕,2011年加入腾讯,现任职于腾讯互娱运营部数据中心,主要从事游戏相关的数据分析和挖掘工作. 信息增益原 ...
- 使用CSharp编写Google Protobuf插件
什么是 Google Protocol Buffer? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 ...