概述
涉及多线程问题,往往绕不开「锁」。在 JDK 1.5 之前,Java 通过 synchronized 关键字来实现锁的功能,该方式是语法层面的,由 JVM 实现。JDK 1.5 增加了锁在 API 层面的实现,也就是 java.util.concurrent.locks.Lock 接口及其相关的实现类,它不仅具备 synchronized 的功能,而且还增加了更加丰富的功能。
Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。
源码分析
Lock 接口的定义如下:
public interface Lock {
// 阻塞式获取锁,该方法与synchronized功能类似
void lock();
// 获取锁,可响应中断
void lockInterruptibly() throws InterruptedException;
// 尝试获取锁,若成功返回true;否则返回false
boolean tryLock();
// 尝试获取锁(在给定的时间内),若成功返回true;否则返回false
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 释放锁
void unlock();
// 创建一个与该锁绑定的Condition
Condition newCondition();
}
Lock接口中主要定义了 获取锁、尝试获取锁、释放锁、条件锁等几个方法。
ReentrantLock构造方法:
// 默认构造方法
public ReentrantLock(){
sync = new NonfairSync();
}
// 自己可选择使用公平锁还是非公平锁
public ReentrantLock(boolean fair){
sync = fair ? new FairSync():new NonfairSync();
}
(1)默认构造方法使用的是非公平锁;
(2)第二个构造方法可以自己决定使用公平锁还是非公平锁;
ReentrantLock主要内部类
abstract static class Sync extends AbstractQueuedSynchronizer {}
static final class NonfairSync extends Sync {}
static final class FairSync extends Sync {}
(1)抽象类Sync实现了AQS的部分方法;
(2)NonfairSync实现了Sync,主要用于非公平锁的获取;
(3)FairSync实现了Sync,主要用于公平锁的获取。
在这里我们先不急着看每个类具体的代码,等下面学习具体的功能点的时候再把所有方法串起来。
常用方法后续学习补充~