ReentrantLock

  • 一.重入锁的特点
    • 1)实现重进入功能
    • 2)分为公平锁和非公平锁:
  • 二.ReentrantLock和AQS的关系

一.重入锁的特点

1)实现重进入功能

重进入是指任意线程获取锁之后能够再次获取该锁而不会被锁阻塞
锁的获取和释放过程如下:

  1. 线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是则再次获取成功。
  2. 锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数器等于0时表示锁已经成功释放了。

2)分为公平锁和非公平锁:

公平锁:

  1. 对先发起请求的线程即等待最久的线程优先满足,获取锁是顺序的,符合FIFO原则,不会产生线程饥饿
  2. 获取锁调用tryAcquire方法,与非公平锁不一样的地方在于判断条件多了hasQueuedPredecessors()方法,个方法判断队列中是否有其他节点,如果队列中还有其他节点,但是head后面还没关联节点 / 或者队列中head节点的后继节点关联的线程不是当前线程,如果是返回true,则表示有线程比当前线程更早地请求获取锁,因为要等待前驱节点获取并释放锁后才嫩继续获取到锁。

非公平锁(默认的):

  1. 获取是使用nonfairTryAcquire方法,只要CAS设置同步状态成功,则当前线程获取了锁。
  2. 非公平锁比公平锁效率更高,因为公平锁为了保证公平性会去切换线程导致上下文切换,存在额外的开销,所以非公平锁性能更好(所以作为默认的实现方式),保证了更大的吞吐量,但是可能会产生线程饥饿

二.ReentrantLock和AQS的关系

锁底层大多方法是使用AQS来实现的。

一般我们使用ReentrantLock都是直接创建一个对象,例如下面代码

Lock lock = new ReentrantLock();

下面我们看下ReentrantLock的构造函数

 public ReentrantLock() {//默认实现是以非公平锁实现的sync = new NonfairSync();}

从上面这个代码可以看出,我们要分析两个东西:一个是sync,一个是NofairSync(非公平锁):

//ReentrantLock实现了Lock
public class ReentrantLock implements Lock, java.io.Serializable {//我们刚刚要找的sync字段private final Sync sync;//Sync继承了AbstractQueuedSynchronizerabstract static class Sync extends AbstractQueuedSynchronizer {

1.sync分析:从上面源码可以看出sync是ReentrantLock内的属性,而且Sync是ReentrantLock的内部类,并且继承了AbstractQueuedSynchronizer,这个就是我们常常说的AQS,再进入AQS类看下:

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizerimplements java.io.Serializable {

从上面源码可以看出AbstractQueuedSynchronizer继承AbstractOwnableSynchronizer,也就是AQS继承AOS(后面都用AQS代表AbstractQueuedSynchronizer,AOS代表AbstractOwnableSynchronizer),我们再看看还没分析的NofairSync;

public class ReentrantLock implements Lock, java.io.Serializable {//NonfairSync继承Syncstatic final class NonfairSync extends Sync {

2.NofairSync分析:从上面源码可以看出NonfairSync也是ReentrantLock的内部类,并且继承Sync,难怪刚刚new NonfairSync()可以直接赋值给sync我们再看下ReentrantLock类的结构:


到这里我们可以总结下:
1.ReentrantLock下面有三个内部类:Sync,NonfairSync,FairSync
2.AQS继承AOS
2.Sync继承AQS
3.NonfairSync(非公平锁)、FairSync(公平锁)分别继承Sync

那我们可以得出UML图

AQS和ReentrantLock参考源码分析:
https://guguoyu.blog.csdn.net/article/details/90485326

重入锁-ReentrantLock相关推荐

  1. 并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition

    文章目录 J.U.C脑图 ReentrantLock概述 ReentrantLock 常用方法 synchronized 和 ReentrantLock的比较 ReentrantLock示例 读写锁R ...

  2. Java 重入锁 ReentrantLock 原理分析

    1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...

  3. java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  4. java多线程---重入锁ReentrantLock

    1.定义 重入锁ReentrantLock,支持重入的锁,表示一个线程对资源的重复加锁. 2.底层实现 每个锁关联一个线程持有者和计数器,当计数器为0时表示该锁没有被任何线程持有,那么任何线程都可能获 ...

  5. 重入锁ReentrantLock详解

    重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. 在AQS实现中,当一个线程调用Mute ...

  6. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  7. java lock可重入_Java源码解析之可重入锁ReentrantLock

    本文基于jdk1.8进行分析. ReentrantLock是一个可重入锁,在ConcurrentHashMap中使用了ReentrantLock. 首先看一下源码中对ReentrantLock的介绍. ...

  8. Java多线程——重入锁ReentrantLock源码阅读

    上一章<AQS源码阅读>讲了AQS框架,这次讲讲它的应用类(注意不是子类实现,待会细讲). ReentrantLock,顾名思义重入锁,但什么是重入,这个锁到底是怎样的,我们来看看类的注解 ...

  9. Java 并发编程之可重入锁 ReentrantLock

    Java 提供了另外一个可重入锁,ReentrantLock,位于 java.util.concurrent.locks 包下,可以替代 synchronized,并且提供了比 synchronize ...

  10. JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理

    synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...

最新文章

  1. oracle 新增自增字段,SQL server、Oracle中拿到新增列时的自增字段值
  2. 如何大写字符串中每个单词的第一个字符
  3. 同一个ip能否两次加入组播_组播IGMPv1/v2/v3精华知识汇总
  4. AMD CEO苏姿丰称芯片短缺还将持续 今年相当紧缺
  5. DataTable增加行
  6. 2016年PMP项目管理知识体系精髓总结
  7. visio设置网络拓扑图
  8. 推荐的开源 PHP CMS 系统
  9. 【计算机网络】计算机网络基础知识笔记
  10. 音频,视频合并软件——ffmpeg下载及使用
  11. 最新谷歌GOOGLE搜索命令大全
  12. 17行python代码轻松搞定堆糖网所有小姐姐图片
  13. Raid4校验盘之殇
  14. Win10 没有激活,如何改变任务栏位置
  15. python用scrapy爬取58同城的租房信息
  16. jdbc连接mysql数据库,设置字符集编码
  17. 7-43 查询水果价格
  18. 计算机系学不学工程力学,工程力学专业属于什么门类
  19. 好用又免费的办公软件
  20. 弘辽科技:淘宝怎么改发货时间?有什么发货规则?

热门文章

  1. fonttype: Font T1 is of type Type3
  2. day 18 C# 窗体普通计算器
  3. Flash CS3编程
  4. 使用AlarmManager实现Android应用每天定时执行任务
  5. 【哪些工作会被ChatGPT取代?】我用ChatGPT全自动化生成代码进行了深度分析
  6. 《系统工程手册》中提及的Expert Choice软件
  7. ZGRjdGYyMDE5d3A=
  8. 让你的文章变得‘好看’--分享一些不错的字体颜色
  9. iOS中运用coreText 进行文字自适应
  10. JAVA打包软件exe4j使用教程