问题解答
关于这个问题从这几个方面来回答:
1、什么是ReentrantLock
2、ReentrantLock的特性
3、ReentrantLock的实现原理
首先,ReentrantLock是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。
它的核心特性有几个:
1. 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
2. 它支持公平和非公平特性
3. 它提供了阻塞竞争锁和非阻塞竞争锁的两种方法,分别是lock()和tryLock()。
(如图)然后,ReentrantLock的底层实现有几个非常关键的技术。
锁的竞争,ReentrantLock是通过互斥变量,使用CAS机制来实现的:
5. 没有竞争到锁的线程,使用了AbstractQueuedSynchronizer这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从AQS队列里面的头部唤醒下一个等待锁的线程。
6. 公平和非公平的特性,主要是体现在竞争锁的时候,是否需要判断AQS队列存在等待中的线程。
7. 最后,关于锁的重入特性,在AQS里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。
面试点评
这道题很简单,但是要回答好,有两个关键点。
大家必须要理解ReentrantLock的整个设计思想,表达一定要清晰有条理。
还是那句话,虽然基础,但很重要。地基的深度决定了楼层的高度。