【Java面試】請說一下ReentrantLock的實現原理?

跟著Mic學架構 發表於 2022-06-17
Java 面試

一個工作了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裡面有一個成員變數來儲存當前獲得鎖的執行緒,當同一個執行緒下次再來競爭鎖的時候,就不會去走鎖競爭的邏輯,而是直接增加重入次數。

以上就是我對這個問題的理解。

image-20220422000218345

總結

這道題很簡單,但是要回答好,有兩個關鍵點。

  1. 大家必須要理解ReentrantLock的整個設計思想
  2. 表達一定要清晰有條理

還是那句話,雖然基礎,但很重要。地基的深度決定了樓層的高度。

如果有任何面試問題、職業發展問題、學習問題,都可以私信我。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!

相關文章