一個工作了3年的粉絲私信我,在面試的時候遇到了這樣一個問題。 ”請說一下ReentrantLock的實現原理“,他當時根據自己的理解零零散散的說了一些。 但是似乎沒有說到關鍵點上,讓我出一期說一下回答思路。 好吧,關於這個問題,我們來看看普通人和高手的回答。 普通人: ReentrantLock的一 ...
一個工作了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學架構」公眾號公眾號獲取更多技術乾貨!