关于java:Java面试请说一下ReentrantLock的实现原理

37次阅读

共计 1033 个字符,预计需要花费 3 分钟才能阅读完成。

一个工作了 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 带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!

正文完
 0