今天跟大家談一談併發編程中,大廠面試官經常會問的一個最簡單的問題:“非公平鎖和公平鎖有什麼區別?”
看完第一眼,是不是很簡單?
很多人張口就回答:“隨機訪問”、“插隊訪問””。
這麼回答對不對?只能說,也沒錯。但如果我作爲面試官,我最想聽到的就是:非公平鎖有兩次搶鎖機會,但是一旦進入隊列,就永遠排隊。“一朝排隊,永遠排隊。”
上面的結論,是我通過分析公平鎖和非公平鎖lock方法的源碼之後得出來的。
公平鎖lock方法的源碼分析
final void lock() {
acquire(1);//1------標識加鎖成功之後改變的值
}
非公平鎖的lock方法
finalvoid lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
公平鎖、非公平鎖代碼執行邏輯的區別
用一個例子來通俗講解公平鎖和非公平鎖,那就是:
1、你去火車站買車票,大家都老老實實排隊,你也跟着排隊,非常公平合理,這就是公平鎖;
2、你去火車站買車票,大家都老老實實排隊,但你是個小混混,直接走到售票窗口,“給我一張票!”
結果1:大家都不敢吭聲,售票員直接把票賣給你了;搶鎖成功
結果2:又來了一個小混混,把你按在地上一頓摩擦,他插隊買票,你乖乖到後面排隊;搶鎖失敗
很多人認爲非公平鎖插隊就是永遠在插隊,實際上只要它第一次加鎖失敗之後,一旦進入隊列,跟公平鎖就沒有區別了。
爲什麼阿里巴巴、美團經常會問你這些看起來很簡單的面試題?因爲這些看似簡單的題目,面試官可以從你的回答裏看出你的真實水平。****(文末有驚喜,筆者整理了阿里、美團等大廠的面試題,看看你能否答上來?)
Java中有各種各樣的鎖,每種鎖因其特性的不同,在適當的場景下能夠展現出非常高的效率!從互斥鎖/讀寫鎖、樂觀鎖/悲觀鎖、自旋鎖、分段鎖…再到JDK鎖、分佈式鎖,你對Java中的鎖瞭解多少?
谷歌線上如何使用鎖及各種鎖的效率有何不同?
主流分佈式鎖方案你知道哪些?
如何實現Redis分佈式鎖?
說在最後
這裏還有一份剛更新的《2020最新大廠面試題彙總》,>點擊此處,免費領取以下資料