ReentrantLock 锁实现

ReentrantLock 是 java.util.concurrent.locks 包下的类 , 实现 Lock 接口。 Lock 的意义在于提供区别于 synchronized 的另一种具有更多广泛操作的同步方式,它能支持更多灵活的结构。

特点

ReentrantLock 基于 AQS,在并发编程中它可以实现公平锁和非公平锁来对共享资源进行同步,同时和 synchronized 一样,ReentrantLock 支持可重入,除此之外,ReentrantLock 在调度上更灵活,支持更多丰富的功能

ReentrantLock类内部总共存在 SyncNonfairSyncFairSync 三个类,NonfairSyncFairSync 类继承自Sync 类 , Sync类继承自 AbstractQueuedSynchronizer抽象类。

ReentrantLock 锁实现_第1张图片 

核心源码

Sync 类继承 AbstractQueuedSynchronizer

abstract static class Sync extends AbstractQueuedSynchronizer

构造方法

//无参构造,一个是默认的
public ReentrantLock(){
    sync = new NonfairSync(); //默认使用非公平锁
}
​
//有参构造,可以指定使用公平/非公平
public ReentrantLock(boolean fair){
    sync = fair ? new fairSync() : new NonfairSync();
}

NonfairSync

static final class NonfairSync extends Sync {
    //加锁
    final void lock() {
    //若通过 CAS 设置变量 state 成功,就是获取锁成功,则将当前线程设置为独占线程。
    //若通过 CAS 设置变量 state 失败,就是获取锁失败,则进入 acquire 方法进行后续处理。
        if (compareAndSetState(0, 1))
            setExclusiveOwnerThread(Thread.currentThread());
        else
            acquire(1);
    }
    //尝试获取锁,无论是否获得都立即返回
    protected final boolean tryAcquire(int acquires) {
        return nonfairTryAcquire(acquires);
    }
}

NonfairSync 类继承了 Sync 类,表示采用非公平策略获取锁,其实现了 Sync 类中抽象的 lock 方法。

FairSync

static final class FairSync extends Sync {
    final void lock() {
        // 以独占模式获取对象,忽略中断
        acquire(1);//底层实现交由 AbstractQueuedSynchronizer
    }
}

FairSync 类也继承了 Sync 类,表示采用公平策略获取锁,其实现了 Sync 类中的抽象 lock 方法。

你可能感兴趣的:(面经,并发编程,笔试笔记,java,开发语言)