文章目录
- 一、前言
- 二、AQS源码对于lock.lock()的实现
-
- 2.1 AQS类 + 内部Node类
- 2.2 公平锁加锁需要工作队列:FairSync中的lock()方法(重点)
- 2.3 非公平锁加锁不需要队列:NonfairSync类的lock()方法(了解即可,搞懂了公平锁的lock(),这个就好懂了,然后只要知道公平锁lock()和非公平锁lock()区别就好)
- 2.4 其他加锁方法:ReentrantLock类的tryLock()方法(了解即可,和上面公平锁lock()大同小异)
- 2.5 其他加锁方法:ReentrantLock类的tryLock(long timeout, TimeUnit unit)方法(了解即可,和上面公平锁lock()大同小异)
- 2.6 其他加锁方法:ReentrantLock类的lockInterruptibly()方法(了解即可,和上面公平锁lock()大同小异)
- 三、AQS源码对于lock.unlock()的实现
- 四、面试金手指(ReentrantLock中lock()与unlock(),即AQS加锁解锁)
- 五、尾声
一、前言
Java线程同步两种方式,synchronized关键字和Lock锁机制,其中,AQS队列就是Lock锁实现公平加锁的底层支持,AQS就是同步队列。
二、AQS源码对于lock.lock()的实现
2.1 AQS类 + 内部Node类
2.1.1 AQS类结构示意图
首先我们要看看AQS的结构的类图
从AQS类的类结构示意图可以知道,
1、AbstractQueuedSynchronizer的父类是AbstractOwnableSynchronizer;
2、AbstractQueuedSynchronizer的子类是Sync,然后又通过继承Sync得到了FairSync公平锁和UnfaiSync非公平锁,所以,AQS是Lock锁机制实现公平锁的底层支持。
2.1.2 内部Node类
通过上面的结构图,我们可以知道该类维护了一个Node内部类,于是我们查看Node的源码如下,主要是用来实现上面的我们提到的队列。
s