首先,ReentrantLock 是一种可重入的排它锁,主要用来解决多线程对共享资源 竞争的问题。 它的核心特性有几个: 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候, 不需要加锁就可以直接访问。 它支持公平和非公平特性 它提供了阻塞竞争锁和非阻塞竞争锁的两种方法,分别是 lock()和 tryLock()。
然后,ReentrantLock的底层实现有几个非常关键的技术。
锁的竞争,ReentrantLock 是通过互斥变量,使用 CAS 机制来实现的。 没有竞争到锁的线程,使用了 AbstractQueuedSynchronizer 这样一个队列同步 器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从 AQS 队列里 面的头部唤醒下一个等待锁的线程。 公平和非公平的特性,主要是体现在竞争锁的时候,是否需要判断 AQS 队列存 在等待中的线程。
最后,关于锁的重入特性,在 AQS 里面有一个成员变量来保存当前获得锁的线 程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接 增加重入次数。