一個工作了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帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!