概述
ReentrantLock,即重入锁,是一个和synchronized关键字等价的,支持线程重入的互斥锁。只是在synchronized已有功能基础上添加了一些扩展功能。
除了支持可中断获取锁、超时获取锁、非阻塞获取锁这些显示锁的常见功能外,ReentrantLock还支持公平锁(synchronized只支持非公平锁)。
下面分析源码时将聚焦重入和公平这两个功能点的实现。
结构总览
重入锁的大体结构如下:
public class ReentrantLock implements Lock, java.io.Serializable { abstract static class Sync extends AbstractQueuedSynchronizer {} static final class NonfairSync extends Sync {} static final class FairSync extends Sync {}
}Sync类是AQS的子类,而NonfairSync和FairSync是Sync的子类。
公平锁和非公平锁的区别就在于获取锁时候的逻辑略有不同,其他操作都是一样的,因此公用的操作都放在Sync类里,NonfairSync和FairSync里只是实现自己的tryAcquire(int acquires)方法。

