Java并发源码之ReentrantLock

Wesley13
• 阅读 858

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
ReenTrantLock可重入锁和synchronized的区别
ReenTrantLock可重入锁和synchronized的区别可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:S
Wesley13 Wesley13
2年前
Java学习笔记7
lock接口实现类ReentrantLock我们可以用lock对象,来对临界资源加锁,只有获得lock对象才能访问临界资源,如果没有获得lock对象,就会进入lock对象的锁池。trylock()方法会返回布尔值,这个方法是用来判断这个锁对象是不是已经被线程获取,如果返回值为true,则会直接获得这个锁对象,如果返回false,线程不会阻塞还会继
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
4个月前
并发情况如何实现加锁来保证数据一致性? | 京东云技术团队
单体架构下锁的实现方案1\.ReentrantLock全局锁ReentrantLock(可重入锁),指的是一个线程再次对已持有的锁保护的临界资源时,重入请求将会成功。简单的与我们常用的Synchronized进行比较:||ReentrantLock|Syn
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这