【Java】锁 - Lock 接口

Posted by 西维蜀黍 on 2019-07-12, Last Modified on 2021-09-21

Lock接口

我们现在就来看看lock接口定义了哪些方法:

//获取锁 
void lock(); 

//获取锁的过程能够响应中断
void lockInterruptibly() throws InterruptedException 

//非阻塞式响应中断能立即返回,获取锁放回true反之返回fasle 
boolean tryLock();

//超时获取锁,在超时内或者未中断的情况下能够获取锁 
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

//获取与lock绑定的等待通知组件,当前线程必须获得了锁才能进行等待,进行等待时会先释放锁,当再次获取锁时才能从等待中返回
Condition newCondition();

实现类 - ReentrantLock

public class ReentrantLock implements Lock, java.io.Serializable

很显然ReentrantLock类实现了lock接口,接下来我们来仔细研究一下它是怎样实现的。

当你查看源码时,你会惊讶的发现ReentrantLock并没有多少代码,另外有一个很明显的特点是:基本上所有的方法的实现实际上都是调用了其静态抽象类Sync中的方法,而Sync类继承了AbstractQueuedSynchronizer(AQS)。静态抽象类Sync有两个实现类,分别是NonfairSync类和FairSync类。

可以看出要想理解ReentrantLock关键核心在于对队列同步器AbstractQueuedSynchronizer(简称同步器)的理解。