文章内容已经收录在《高级技术专家成长笔记》,欢迎订阅专栏!
从原理出发,直击面试难点,实现更高维度的降维打击!
目录
- [ReentrantLock 源码分析]
- [ReentrantLock 源码结构]
- [如何基于 AQS 扩展加锁功能?]
- [ReentrantLock 如何实现公平锁?]
- [ReentrantLock 如何实现解锁?]
ReentrantLock 源码分析
ReentrantLock
是 JDK1.5 开始提供的可重入锁,用于实现线程间互斥操作,有公平锁和非公平锁两种获取锁的方式。
AQS
提供了 CLH
队列锁来进行线程的阻塞等待和唤醒的功能。
ReentrantLock
底层基于 AQS
的线程阻塞、唤醒功能,实现了线程加锁,比如 tryLock()
、 tryLock(timeout)
、 lockInterruptibly()
功能。
ReentrantLock 源码结构
概括来说的话 ReentrantLock
就是在 AQS
外边套了一层皮,实现了加锁功能。
ReentrantLock
主要由 3 个类组成:
Sync
:继承自AbstractQueuedSynchronizer
,获得了线程阻塞、唤醒的能力,并扩展了获取锁、释放锁的功能。NonfairSync
:继承自Sync
,提供了非公平获取锁的功能。FairSync
:继承自Sync
,提供了公平获取锁的功能。
结构如下:
public class ReentrantLock implements Lock, java.io.Serializable {
// 1、同步器
abstract static class Sync extends AbstractQueuedSynchronizer {}
// 2、非公平同步器
static final class NonfairSync extends Sync {}
// 3、公平同步器
static final class FairSync extends Sync {}
}
如何基于 AQS 扩展加锁功能?
AQS
作为一个底层工具,仅提供了线程阻塞和唤醒的能力,并没有加锁能力,ReentrantLock
基于 AQS
的能力,实现了加锁、解锁等一系列功能。
接下来从 Reen