【Java面试】请说一下ReentrantLock的实现原理?
2024-08-31 11:35:48
一个工作了3年的粉丝私信我,在面试的时候遇到了这样一个问题。
”请说一下ReentrantLock的实现原理“,他当时根据自己的理解零零散散的说了一些。
但是似乎没有说到关键点上,让我出一期说一下回答思路。
好吧,关于这个问题,我们来看看普通人和高手的回答。
普通人:
ReentrantLock的一个实现原理,他是一种重入锁然后也是一种重入的一个排它锁。
它会去解决我们在多个线程的并行去访问某一些共享资源的时候,我就可以通过ReentrantLock去加锁。
实现原理就是通过AQS来实现锁的一个叫线程的一个同步的,他的核心是AQS。
高手:
好的,面试官,关于这个问题,我会从这几个方面来回答。
- 什么是ReentrantLock
- ReentrantLock的特性
- ReentrantLock的实现原理
首先,ReentrantLock是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。
它的核心特性有几个:
- 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
- 它支持公平和非公平特性
- 它提供了阻塞竞争锁和非阻塞竞争锁的两种方法,分别是lock()和tryLock()。
然后,ReentrantLock的底层实现有几个非常关键的技术。
- 锁的竞争,ReentrantLock是通过互斥变量,使用CAS机制来实现的。
- 没有竞争到锁的线程,使用了AbstractQueuedSynchronizer这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从AQS队列里面的头部唤醒下一个等待锁的线程。
- 公平和非公平的特性,主要是体现在竞争锁的时候,是否需要判断AQS队列存在等待中的线程。
- 最后,关于锁的重入特性,在AQS里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。
以上就是我对这个问题的理解。
总结
这道题很简单,但是要回答好,有两个关键点。
- 大家必须要理解ReentrantLock的整个设计思想
- 表达一定要清晰有条理
还是那句话,虽然基础,但很重要。地基的深度决定了楼层的高度。
如果有任何面试问题、职业发展问题、学习问题,都可以私信我。
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
Mic带你学架构
!
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!
最新文章
- 数据结构(c语言)之学生信息管理系统
- centos6 搭建ELK
- 【原创】.NET Core应用类型(Portable apps &; Self-contained apps)
- mongoDb学习以及spring管理
- 配置Java EE Eclipse+Tomcat开发环境
- C++学习14 继承的概念及语法
- Android Studio ndk-Jni开发详细
- JavaScript之数组学习
- git 分支改名
- spring boot 1.x.x 到 spring boot 2.x.x 的那些变化
- JGUI源码:鼠标中键滚动再次优化(5)
- A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the following locations: /usr/local/eclipse/
- YOLO 从数据集制作到训练
- .net core 2.0 数据访问-迁移
- 虚拟串口VSPD破解版 亲测win10 64可用
- LINUX文件删除,但磁盘空间未释放
- freemarker学习 (servlet + freemarker ->; Struts2+freemarker ->; springMVC+freemarker)
- Linux用7zip解压缩分卷文件
- HBase高性能复杂条件查询引擎
- mysql存储引擎ARCHIVE
热门文章
- 微信小程序获取当前时间戳、获取当前时间、时间戳加减
- 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)
- 学习打卡day16&;&;echarts入门
- 这个API Hub厉害了,收录了钉钉企业微信等开放Api,还能直接调试
- Codeforces Round #767 (Div. 2)——B. GCD Arrays
- Java语言学习day02--6月29日
- HTML中的Hack手段之条件注释
- CentOS Nginx的安装与部署
- 如何查看和修改Windows远程桌面端口
- Spring Ioc源码分析系列--前言