一个工作了3年的粉丝私信我,在面试的时候遇到了这样一个问题。

”请说一下ReentrantLock的实现原理“,他当时根据自己的理解零零散散的说了一些。

但是似乎没有说到关键点上,让我出一期说一下回答思路。

好吧,关于这个问题,我们来看看普通人和高手的回答。

普通人:

ReentrantLock的一个实现原理,他是一种重入锁然后也是一种重入的一个排它锁。

它会去解决我们在多个线程的并行去访问某一些共享资源的时候,我就可以通过ReentrantLock去加锁。

实现原理就是通过AQS来实现锁的一个叫线程的一个同步的,他的核心是AQS。

高手:

好的,面试官,关于这个问题,我会从这几个方面来回答。

  • 什么是ReentrantLock
  • ReentrantLock的特性
  • ReentrantLock的实现原理

首先,ReentrantLock是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。

它的核心特性有几个:

  1. 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
  2. 它支持公平和非公平特性
  3. 它提供了阻塞竞争锁和非阻塞竞争锁的两种方法,分别是lock()和tryLock()。

然后,ReentrantLock的底层实现有几个非常关键的技术。

  1. 锁的竞争,ReentrantLock是通过互斥变量,使用CAS机制来实现的。
  2. 没有竞争到锁的线程,使用了AbstractQueuedSynchronizer这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从AQS队列里面的头部唤醒下一个等待锁的线程。
  3. 公平和非公平的特性,主要是体现在竞争锁的时候,是否需要判断AQS队列存在等待中的线程。
  4. 最后,关于锁的重入特性,在AQS里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。

以上就是我对这个问题的理解。

总结

这道题很简单,但是要回答好,有两个关键点。

  1. 大家必须要理解ReentrantLock的整个设计思想
  2. 表达一定要清晰有条理

还是那句话,虽然基础,但很重要。地基的深度决定了楼层的高度。

如果有任何面试问题、职业发展问题、学习问题,都可以私信我。

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构

如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

最新文章

  1. 数据结构(c语言)之学生信息管理系统
  2. centos6 搭建ELK
  3. 【原创】.NET Core应用类型(Portable apps & Self-contained apps)
  4. mongoDb学习以及spring管理
  5. 配置Java EE Eclipse+Tomcat开发环境
  6. C++学习14 继承的概念及语法
  7. Android Studio ndk-Jni开发详细
  8. JavaScript之数组学习
  9. git 分支改名
  10. spring boot 1.x.x 到 spring boot 2.x.x 的那些变化
  11. JGUI源码:鼠标中键滚动再次优化(5)
  12. 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/
  13. YOLO 从数据集制作到训练
  14. .net core 2.0 数据访问-迁移
  15. 虚拟串口VSPD破解版 亲测win10 64可用
  16. LINUX文件删除,但磁盘空间未释放
  17. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)
  18. Linux用7zip解压缩分卷文件
  19. HBase高性能复杂条件查询引擎
  20. mysql存储引擎ARCHIVE

热门文章

  1. 微信小程序获取当前时间戳、获取当前时间、时间戳加减
  2. 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)
  3. 学习打卡day16&&echarts入门
  4. 这个API Hub厉害了,收录了钉钉企业微信等开放Api,还能直接调试
  5. Codeforces Round #767 (Div. 2)——B. GCD Arrays
  6. Java语言学习day02--6月29日
  7. HTML中的Hack手段之条件注释
  8. CentOS Nginx的安装与部署
  9. 如何查看和修改Windows远程桌面端口
  10. Spring Ioc源码分析系列--前言