跳至主要內容

ReentrantLock源码解析

fangzhipeng约 2184 字大约 7 分钟

在分析了AbstractQueuedSynchronier源码后,接下来将具体分析ReentrantLock的源码。

ReentrantLock数据结构

ReentrantLock的底层数据结构是借助AbstractQueuedSynchronizer实现,所以ReentrantLock数据结构依附于AbstractQueuedSynchronizer的数据结构,关于AQS的数据结构,可以看前面的文章。

ReentrantLock类继承关系

ReentrantLock的继承关系如下:

public class ReentrantLock implements Lock, java.io.Serializable {
}

ReentrantLock实现了Lock接口,Lock接口中定义了lock与unlock相关操作,并且还存在newCondition方法,表示生成一个条件。Lock接口代码如下:

public interface Lock {

    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}

类的属性

public class ReentrantLock implements Lock, java.io.Serializable {
    // 序列号
    private static final long serialVersionUID = 7373984872572414699L;    
    // 同步队列
    private final Sync sync;
}

ReentrantLock类的Sync变量是实现Lock功能的关键,Sync继承了AbstractQueuedSynchronizer,对ReentrantLock类的操作大部分都直接转化为对Sync和AbstractQueuedSynchronizer类的操作。

ReentrantLock中的内部抽象类Sync继承了AbstractQueuedSynchronizer;而Sync有两个子类类分别为FairSync和NonfairSync。

image-20231218220055183

类的构造函数

无参构造函数默认使用非公平策略的锁:

    public ReentrantLock() {
        sync = new NonfairSync();
    }

有参构造函数,以传递参数确定采用公平策略或者是非公平策略,参数为true表示公平策略,否则,采用非公平策略。

    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

类的内部类

Sync类

abstract static class Sync extends Ab