简介

介绍

AbstractQueuedSynchronizer是Doug Lea写的,从JDK1.5加入的一个基于FIFO等待队列实现的一个用于实现同步器的基础框架

为什么需要AQS

很多工具类都有很相似的诉求,包括线程阻塞、排队、唤醒等一系列工作是重复的,有了AQS,很方便的构建线程协作类

作用

AQS是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了AQS,构建线程协作类就容易多了

三要素

原理解析

AQS最核心的就是三部分

state

截屏2020-02-16下午3.44.06.png

截屏2020-02-16下午3.44.55.png

控制线程抢锁和配合的FIFO队列

截屏2020-02-16下午3.46.19.png
FIFO双向链表队列
截屏2020-02-16下午3.47.29.png

期望协作工具类去实现的获取/释放等重要方法

截屏2020-02-16下午3.50.41.png

截屏2020-02-16下午3.52.22.png
截屏2020-02-16下午3.53.25.png

源码分析

AQS用法

截屏2020-02-16下午4.21.50.png

AQS在CountDownLatch中的总结

截屏2020-02-16下午4.43.29.png

AQS在semaphore的应用

截屏2020-02-16下午4.48.02.png

AQS在ReentrantLock的应用

截屏2020-02-16下午5.29.03.png
加锁的方法,判断当前锁是否被占用(state是否大于0),被占用了将把线程放入等待队列,合适的时机唤醒

附件

美团技术团队《从ReentrantLock的实现看AQS的原理及应用》:https://mp.weixin.qq.com/s/sA01gxC4EbgypCsQt5pVog

老钱《打通 Java 任督二脉 —— 并发数据结构的基石》:https://juejin.im/post/5c11d6376fb9a049e82b6253

HongJie《一行一行源码分析清楚AbstractQueuedSynchronizer》:https://javadoop.com/post/AbstractQueuedSynchronizer

爱吃鱼的KK《AbstractQueuedSynchronizer 源码分析 (基于Java 8)》:https://www.jianshu.com/p/e7659436538b

waterystone《Java并发之AQS详解》:https://www.cnblogs.com/waterystone/p/4920797.html

英文论文的中文翻译:https://www.cnblogs.com/dennyzhangdd/p/7218510.html

AQS作者的英文论文:http://gee.cs.oswego.edu/dl/papers/aqs.pdf