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