2019独角兽企业重金招聘Python工程师标准>>>

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这个成员变量完成的。

ReentrantLock构造方法

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

ReentrantLock加锁方法

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

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

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

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

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

ReentrantLock释放锁方法

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

ReentrantLock其他方法

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

总结一下

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

转载于:https://my.oschina.net/u/2391658/blog/1553858

Java并发源码之ReentrantLock相关推荐

  1. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理

    前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchroni ...

  2. 基于Java毕业设计晨光文具店进销存系统设计与开发源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计晨光文具店进销存系统设计与开发源码+系统+mysql+lw文档+部署软件 基于Java毕业设计晨光文具店进销存系统设计与开发源码+系统+mysql+lw文档+部署软件 本源码技术栈 ...

  3. java计算机毕业设计医疗机构药房管理系统软件开发源码+数据库+系统+lw文档+部署

    java计算机毕业设计医疗机构药房管理系统软件开发源码+数据库+系统+lw文档+部署 java计算机毕业设计医疗机构药房管理系统软件开发源码+数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B ...

  4. java短信接口源码_java免费短信接口开发源码

    java免费短信接口开发源码 更多 作者:捷信通来源:www.jiexintong.cn日期:2014-07-30 17:08:51 微宏捷信通短信接口提供适应C#.Java..NET等多种主流开发语 ...

  5. Java窗体小游戏开发飞机大作战Java小游戏开发源码

    Java窗体小游戏开发飞机大作战Java小游戏开发源码

  6. JAVA学生信息管理系统课程设计简介以及开发源码介绍

    java学生信息管理系统简介 1.系统简介 主要实现功能:登录,注册,增加,删除,更改,查找,条件查找,查看在线账号,更改密码. 涉及到内容:java mysql8.0 Navicat 可视化工具 2 ...

  7. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  8. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  9. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

最新文章

  1. linux内核seq_file接口
  2. [转载] 晓说——第15期:揭秘欧洲列强恩仇录
  3. python中的chr和ord函数_python chr()和ord() | 学步园
  4. #100. 矩阵乘法
  5. 不适合的研究生,分流!不适合的导师,退出!
  6. 除法应用遇到的问题-类型及小数点
  7. c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生
  8. JavaWeb:tomcat知识以及遇到的一些小问题
  9. H5 video 播放器demo代码
  10. python aiml_Python:用aiml构建英语聊天机器人
  11. 计算机及网络信息安全管理制度,计算机、网络管理及信息安全管理制度
  12. python如何调整图片大小_Python实现图片尺寸缩放脚本
  13. Linux PostgreSQL离线下载与安装
  14. 湘西纪行 芷江 芋头侗寨 通道 黔阳 高椅村
  15. 问题 D: 天神下凡
  16. 我是如何利用Python下载酷狗音乐的
  17. 快速启动iOS模拟器
  18. 最笨的管理,就是什么事都自己做
  19. 「深度神经网络」(deepamp;nbs…
  20. vue使用ajax提交数据,vue中使用ajax请求 data的数据问题

热门文章

  1. mysql 回滚段 表空间_oracle回滚段和回滚表空间
  2. php88,php88微博
  3. python爬取地理数据_python爬取所有人位置信息——腾讯位置大数据
  4. electron 打包 php,electron 将现有vue项目改成支持electron桌面端应用
  5. mysql events_mysql定时器Events
  6. 【Git项目】想成为大咖,先从八卦大咖开始,这个GitHub项目你值得拥有
  7. 【AI-1000问】机器学习和模式识别是什么关系?
  8. 【AI初识境】近20年深度学习在图像领域的重要进展节点
  9. 速卖通运营之如何提升商品动销率
  10. 2022年跨境卖家如何布局海外市场?东南亚“钱”景可观