Java并发源码之ReentrantLock

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成员变量来完成。接下来将会对公平锁和非公平锁进行分析。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

ReenTrantLock可重入锁和synchronized的区别

ReenTrantLock可重入锁和synchronized的区别可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:S