Java并发源码之ReentrantLock

2017/10/20 14:09
阅读数 133

ReentrantLock介绍

ReentrantLock是一个可重入的互斥锁,与使用synchronized方法和语句访问的隐式监视锁具有相同的基本行为和语义,但具有扩展功能。ReentrantLock属于最后一个成功加锁并且还没有释放锁的线程。当一个线程请求lock时,如果锁不属于任何线程,将立马得到这个锁;如果锁已经被当前线程拥有,当前线程会立即返回。

下面这个图是与ReentrantLock相关的UML类图,可以看到ReentrantLock实现了Lock和Serializable接口,表示它实现了lock()、unlock()等Lock的接口方法,并且是一个可以序列化的类。ReentrantLock主要成员变量为Sync,Sync是一个抽象类,继承了AbstractQueuedSynchronizer(简称AQS),AQS提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架,本文不详细介绍。而Sync有两个实现类:NonfairSync和FairSync,分别代表非公平锁和公平锁。也就是说ReentrantLock中所有的锁操作都是由sync这个成员变量完成的。

Java并发源码之ReentrantLock(一)

ReentrantLock构造方法

下面的代码为它的构造函数,可以看到无参构造函数直接返回非公平锁。

Java并发源码之ReentrantLock(一)

ReentrantLock加锁方法

下面是三个常用的ReentrantLock加锁方法,分别为lock、tryLock、lockInterruptibly。

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

上面代码的注释已经很明白,这里我总结一下:

  1. lock:拿不到lock就不会结束,不然线程就一直等待

  2. tryLock:马上返回,拿到lock返回true,否则返回false

  3. lockInterruptibly:线程在请求lock并被阻塞时,如果被中断,则此线程会被唤醒并被要求处理InterruptedException。并且如果线程已经被interrupt,再使用lockInterruptibly的时候,此线程也会被要求处理interruptedException

ReentrantLock释放锁方法

ReentrantLock的释放锁方法比较简单,只有一个unlock。下面是它的说明。

Java并发源码之ReentrantLock(一)

ReentrantLock其他方法

下面列出了ReentrantLock的其他方法都比较好理解。

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

Java并发源码之ReentrantLock(一)

总结一下

本文仅仅是对ReentrantLock做了简单的介绍,包括主要结构和主要方法。通过上面的描述可以看到,ReentrantLock所有的方法都交给了它的sync成员变量来完成。接下来将会对公平锁和非公平锁进行分析。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部