JUC锁: ReentrantLock详解

前言

       可重入锁ReentrantLock的底层实际上是通过AbstractQueuedSynchronizer(AQS)实现的。因为Sync类继承了AQS。ReentrantLock的操作大部分都是AQS的操作。

一、ReentrantLock源码分析

(一)类的继承关系

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

(二)类的内部类

        ReentrantLock类内部总共存在Sync、NonfairSync、FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类。

Sync类存在如下方法和作用如下:

Sync类:

NonfairSync类

        NonfairSync类继承了Sync类,表示采用非公平策略获取锁,其实现了Sync类中抽象的lock方法从lock方法的源码可知,每一次都尝试获取锁,而且并不会按照公平等待的原则进行等待,让等待时间最久的线程获得锁。

FairSyn类

       FairSync类也继承了Sync类,表示采用公平策略获取锁,其实现了Sync类中的抽象lock方法,当资源空闲时,它总是会先判断sync队列(AbstractQueuedSynchronizer中的数据结构)是否有等待时间更长的线程如果存在,则将该线程加入到等待队列的尾部实现了公平获取原则

(三)类的属性

      ReentrantLock类的sync非常重要,对ReentrantLock类的操作大部分都直接转化为对Sync和AbstractQueuedSynchronizer类的操作。

(四)类的构造函数

      ReentrantLock()型构造函数,默认是采用的非公平策略获取锁。也可以通过ReentrantLock(boolean)型构造函数,可以传递参数确定采用公平策略或者是非公平策略,参数为true表示公平策略,否则,采用非公平策略。

(五)核心函数分析

       对ReentrantLock操作实际上都是对Sync对象的操作,由于Sync继承了AQS,所以基本上都可以转化为对AQS的操作。如将ReentrantLock的lock函数转化为对Sync的lock函数的调用,而具体会根据采用的策略(如公平策略或者非公平策略)的不同而调用到Sync的不同子类。

你可能感兴趣的:(JUC锁: ReentrantLock详解)