【多线程面试题十六】、谈谈ReentrantLock的实现原理

这篇具有很好参考价值的文章主要介绍了【多线程面试题十六】、谈谈ReentrantLock的实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

【多线程面试题十六】、谈谈ReentrantLock的实现原理,# 多线程面试题,java,开发语言

面试官:谈谈ReentrantLock的实现原理

参考答案:

ReentrantLock是基于AQS实现的,AQS即AbstractQueuedSynchronizer的缩写,这个是个内部实现了两个队列的抽象类,分别是同步队列和条件队列。其中同步队列是一个双向链表,里面储存的是处于等待状态的线程,正在排队等待唤醒去获取锁,而条件队列是一个单向链表,里面储存的也是处于等待状态的线程,只不过这些线程唤醒的结果是加入到了同步队列的队尾,AQS所做的就是管理这两个队列里面线程之间的等待状态-唤醒的工作。

在同步队列中,还存在2中模式,分别是独占模式和共享模式,这两种模式的区别就在于AQS在唤醒线程节点的时候是不是传递唤醒,这两种模式分别对应独占锁和共享锁。

AQS是一个抽象类,所以不能直接实例化,当我们需要实现一个自定义锁的时候可以去继承AQS然后重写获取锁的方式和释放锁的方式还有管理state,而ReentrantLock就是通过重写了AQS的tryAcquire和tryRelease方法实现的lock和unlock。

ReentrantLock 结构如下图所示:
【多线程面试题十六】、谈谈ReentrantLock的实现原理,# 多线程面试题,java,开发语言
首先ReentrantLock 实现了 Lock 接口,然后有3个内部类,其中Sync内部类继承自AQS,另外的两个内部类继承自Sync,这两个类分别是用来公平锁和非公平锁的。通过Sync重写的方法tryAcquire、tryRelease可以知道,ReentrantLock实现的是AQS的独占模式,也就是独占锁,这个锁是悲观锁。文章来源地址https://www.toymoban.com/news/detail-735250.html

到了这里,关于【多线程面试题十六】、谈谈ReentrantLock的实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis面试题十道

    问题 1:什么是Redis? 答案:Redis是一个开源的内存数据存储系统,也被称为键值存储数据库。它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合,并提供了丰富的操作命令和功能。Redis具有高性能、低延迟和可扩展性,被广泛用于缓存、会话存储、消息队列等

    2024年02月09日
    浏览(12)
  • Hive面试题十道

    问题 1:什么是Hive? 答案:Hive是一个基于Hadoop的数据仓库工具,它提供了类似SQL的查询语言(HiveQL)来进行大规模数据的分析和处理。Hive将结构化数据映射到Hadoop的分布式文件系统(HDFS)上,并通过MapReduce任务执行查询操作。 问题 2:Hive的主要特性是什么? 答案:Hive的主

    2024年02月12日
    浏览(10)
  • 面试之ReentrantLock

    ReentrantLock实现了Lock接口,是一个可重入且独占式的锁,和Synchronized类似,不过ReentrantLock更灵活,更强大, 增加了轮询、超时、中断、公平锁和非公平锁等高级功能。 ReentrantLock 里面有一个内部类 ,Sync 继承 AQS(AbstractQueuedSynchronizer),添加锁和释放锁的大部分操作实

    2024年02月12日
    浏览(13)
  • 面试题:线程池的底层工作原理

    线程池的几个重要的参数: 1、corePoolSize:线程池的核心线程数(也是默认线程数) 2、maximumPoolSize:最大线程数 3、keepAliveTime:允许的线程最大空闲时间(单位/秒) 线程池内部是通过队列+线程实现的,当我们利用线程池执行任务时: 如果此时线程池中的线程数量小于core

    2024年02月12日
    浏览(26)
  • 面试10000次依然会问的【ReentrantLock】,你还不会?

    引言 在并发编程的世界中,ReentrantLock扮演着至关重要的角色。它是一个实现了重入特性的互斥锁,提供了比synchronized更加灵活的锁定机制。ReentrantLock属于java.util.concurrent.locks包,是Java并发API的一部分。 与传统的synchronized方法或代码块相比,ReentrantLock提供了更丰富的

    2024年02月06日
    浏览(14)
  • 结合ReentrantLock来看AQS的原理

    ​ 队列同步器 AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。 同步

    2024年02月16日
    浏览(9)
  • 面试必问的Java 线程池原理及最佳实践

    1. 概述 1.1 线程池是什么 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 创建线程本身开销大,反复创建并销毁,过多的占用内存。所以有大量线程创建考虑使用线程池 。线程池不用反复创建线程达到 线程的复用 ,更具配置

    2024年02月01日
    浏览(17)
  • 《吊打面试官》从根上剖析ReentrantLock的来龙去脉

    🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 🍂 一个人可能走得更快,但是一群人会走得更远! 📝联系方式:wx,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀 并发编程 在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官

    2023年04月21日
    浏览(14)
  • 【面试精讲】Java线程6种状态和工作原理详解,Java创建线程的4种方式

    Java线程6种状态和工作原理详解,Java创建线程的4种方式 一、Java线程的六种状态 二、Java线程是如何工作的? 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现Runnable接口 3. 实现Callable接口与FutureTask 4. 使用线

    2024年03月13日
    浏览(24)
  • ReentrantLock原理--非公平锁、可重入、可打断性

    先从构造器开始看,默认为非公平锁实现 NonfairSync 继承自 AQS 没有竞争时 第一个竞争出现时 Thread-1 执行了 CAS 尝试将 state 由 0 改为 1,结果失败 进入 tryAcquire 逻辑,这时 state 已经是1,结果仍然失败 接下来进入 addWaiter 逻辑,构造 Node 队列 图中黄色三角表示该 Node 的 waitSt

    2023年04月08日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包