一道非常簡單的Java面試題 說在最後

今天跟大家談一談併發編程中,大廠面試官經常會問的一個最簡單的問題:“非公平鎖和公平鎖有什麼區別?

看完第一眼,是不是很簡單?

很多人張口就回答:“隨機訪問”、“插隊訪問””。

這麼回答對不對?只能說,也沒錯。但如果我作爲面試官,我最想聽到的就是:非公平鎖有兩次搶鎖機會,但是一旦進入隊列,就永遠排隊。“一朝排隊,永遠排隊。

上面的結論,是我通過分析公平鎖和非公平鎖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最新大廠面試題彙總》,>點擊此處,免費領取以下資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章