AbstractQueuedSynchronizer
有了它这个基础类可以方便构建其它的线程协作工具类。
AQS三大核心
state状态
- 具体含义会根据不同实现的类不同的定义。比如在semaphore里,它表示剩余的许可证数量,在CountDownLatch里表示还需要倒数的数量。
- state是被volatile修饰的会被并发的修改。所以所有修改的地方都需要保证线程安全。
控制线程抢锁和配合的FIFO队列
这个队列用来存放等待的线程。当多个线程来拿锁时,必须有排队机制将那些没能拿到锁的线程串在一起。当锁释放时,锁管理器就会挑选一个合适的线程占有刚刚释放的锁。
期望协作工具列实现的获取/释放等重要方法
获取操作依赖于state变量会发生阻塞
释放操作不会阻塞
学习资料
美团技术团队《从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