Java源码-AQS
摘要
- AQS是什么
- 使用方式
- 源码原理
1 AQS是什么
摘自java doc,简而言之就是该类基于阻塞队列为同步锁的实现提供了框架功能
java
1 |
|
从注释描述以及类名AbstractQueuedSynchronizer可预见的几个特点
- 该类是个抽象类,使用了模板方法的设计模式定义了整体框架功能,预留了一部分接口的空实现或者抽象方法延迟到子类实现
- 实现了队列功能
- 线程同步临界资源
2 使用方式
java
1 |
|
3 源码原理
大体的思路是从ReentrantLock这个工具类着手
java
1 |
|
跟踪代码就要有主次先后顺序
- 公平锁和非公平锁的实现差异,公平锁要保证的边界肯定要比非公平锁多的,非公平锁的性能理论上也要优于公平锁的
- 锁重入的实现方式
- 队列的实现方式
- 线程实例的处理方式
3.1 类图
- Lock定义了ReentrantLock的顶层抽象,我们只关注#lock(…)和#unLock(…)
- ReentrantLock中有3个内部类,FairSync和NonfairSync分别代表着公平锁和非公平锁的实现,他们父类是Sync
- Sync继承自AQS
- AQS中内部类Node
3.2 构造方法
ReentrantLock中属性sync,构造方法仅仅是指定sync是FairSync还是NonfairSync的实例,默认是NonFairSync
3.3 ReentrantLock#lock(…)方法
时序
3.3.1 AQS#acquire(…)
java
1 |
|
3.3.2 FairSync#tryAcquire(…)
java
1 |
|
3.3.3 NonfairSync#tryAcquire(…)
java
1 |
|
3.3.4 AQS#addWaiter(…)
java
1 |
|
3.3.5 AQS#acquireQueued(…)
java
1 |
|
Java源码-AQS
https://bannirui.github.io/2023/03/11/Java源码-AQS/