概述

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)方法。

网友评论