面試官:你說說ReentrantLock和Synchronized區別

2021-02-08 叫練

大家好!又和大家見面了。為了避免面試尷尬,今天同比較通俗語言和大家聊下ReentrantLock和Synchronized區別!


使用方式

Synchronized可以修飾實例方法,靜態方法,代碼塊。自動釋放鎖。

ReentrantLock一般需要try catch finally語句,在try中獲取鎖,在finally釋放鎖。需要手動釋放鎖。


實現方式

Synchronized是重量級鎖。重量級鎖需要將線程從內核態和用戶態來回切換。如:A線程切換到B線程,A線程需要保存當前現場,B線程切換也需要保存現場。這樣做的缺點是耗費系統資源

ReentrantLock是輕量級鎖。採用cas+volatile管理線程,不需要線程切換切換,獲取鎖線程覺得自己肯定能成功,這是一種樂觀的思想(可能失敗)。

用一個形象例子來說明:比如您在看我這篇文章時,覺得「重量級鎖」概念不是很明白,就立刻去翻看關於「重量級鎖」的其他文章,過會兒回頭再繼續往下面看, 這種行為我們稱為切換。保存現場的意思就是你大腦需要記住你跳躍的點然後繼續閱讀,如果文章篇幅大,你的大腦可能需要記憶越多的東西,會越耗費腦神經。同理,在輕量級鎖中,你覺得「重量級鎖」概念不是很明白,他不會立刻去翻看其他文章,他會堅持會兒繼續看,如果實在不明白再去翻資料了。需要注意的是:這是兩種不一樣的思維方式,前者是被動阻塞悲觀鎖,狀態是block,後者是主動的阻塞樂觀鎖,狀態是wait。


公平和非公平

Synchronized只有非公平鎖。

ReentrantLock提供公平和非公平兩種鎖,默認是非公平的。公平鎖通過構造函數傳遞true表示。

用一個形象例子來說明:排隊打飯,Synchronized允許插隊,如果ReentrantLock是公平鎖,就不許插隊了。


可重入鎖

Synchronized和ReentrantLock都是可重入的,Synchronized是本地方法是C++實現,而ReentrantLock是JUC包用Java實現。

用一個形象例子來說明:如下圖:一個房中房,房裡外各有一把鎖,但只有唯一的鑰匙可以開,擁有鑰匙的人可以先進入門1,再進入門2,其中進入門2就是叫鎖可重入了。

在ReentrantLock中,重入次數用整形state表示。進入1次遞增1次,出來1次遞減1次。



可中斷的

Synchronized是不可中斷的。

ReentrantLock提供可中斷和不可中斷兩種方式。其中lockInterruptibly方法表示可中斷,lock方法表示不可中斷。

用一個形象例子來說明:叫練和叫練女朋友一起去做核酸,叫練女朋友排在前面,所以叫練女朋友進門先做,叫練在門外排隊等待過程中突然接到領導電話要回去修改bug,叫練現在有兩種選擇,1.不和女朋友打招呼,立即回去修改bug,2.等待女朋友做完核酸,進去和女朋友打個招呼,然後回去修改bug。這兩種情況最終都會導致一個結果,叫練無法完成核酸,在這兩種情況中,雖然叫練都被領導中斷了,但第一種情況叫練立即反饋領導叫可中斷,第二種情況是叫練為了不做單身狗,打個招呼再去修改bug,需要注意的是「打招呼」需要提前獲取鎖,也就是需要等待叫練女朋友做完核酸檢測。如果是你,遇到叫練這種情況,你會怎麼辦?期待你的答覆!點關注,不迷路,我是叫練【公眾號】,邊叫邊練。


條件隊列

Synchronized只有一個等待隊列。

ReentrantLock中一把鎖可以對應多個條件隊列。通過newCondition表示。

用一個形象例子來說明:母雞下蛋和撿蛋人對應生產者和消費者,母雞產蛋後,撿蛋人需要被母雞通知,母雞產蛋過程中,其中撿蛋人就會入條件隊列(等待隊列)。撿蛋人撿蛋完成後,撿蛋人需要通知母雞繼續產蛋,撿蛋人撿蛋過程中,母雞也需要加入條件隊列等待。



注意:有幾個概念需要說明下。同步隊列,條件隊列和等待隊列。

同步隊列:多線程同時競爭一把鎖失敗被掛起的線程。

條件隊列:正在執行的線程調用await/wait,從同步隊列加入的線程會進入條件隊列。正在執行線程調用signal/signalAll/notify/notifyAll,會將條件隊列一個線程或多個線程加入到同步隊列。

等待隊列:和條件隊列一個概念。



總結

今天我們用通俗易懂的文字描述了ReentrantLock和Synchronized關係。喜歡的請點讚加評論哦!點關注,不迷路,我是叫練【公眾號】,邊叫邊練。期待我們下次再見!

相關焦點

  • 面試官:不使用synchronized和lock,如何實現一個線程安全的單例?
    稍微了解一點單例的朋友也都知道實現單例是要考慮並發問題的,一般情況下,我們都會使用synchronized來保證線程安全。那麼,如果有這樣一道面試題:不使用synchronized和lock,如何實現一個線程安全的單例?你該如何回答?C類應聘者:可以使用餓漢模式實現單例。
  • Java中synchronized鎖和lock鎖的比較
    Java並發之顯式鎖和隱式鎖的區別在面試的過程中有可能會問到:在Java並發編程中,鎖有兩種實現:使用隱式鎖和使用顯示鎖分別是什麼?兩者的區別是什麼?所謂的顯式鎖和隱式鎖的區別也就是說說Synchronized(下文簡稱:sync)和lock(下文就用ReentrantLock來代之lock)的區別。
  • 動態高並發時為什麼推薦ReentrantLock而不是Synchronized?
    在面試時被問到 Synchronized 和 ReentrantLock 的使用選擇時,很多朋友都脫口而出的說用 Synchronized ,甚至在我面試的時候問面試者,也很少有人能夠答出所以然來,moon 想說,這可不一定,只對標題感興趣的同學可以直接劃到最後,我可不是標題黨~Synchronized
  • 面試官:你手寫過堵塞隊列嗎?
    :你好,你先做個自我介紹吧某人:面試官你好,我叫開局一張嘴面試全靠吹,某某年畢業,畢業自家裡蹲大學,做過某某項目。。。。。。某人:沒有手寫過。面試官:哦,那你說下堵塞隊列吧某人支支吾吾:這個有點忘了面試官:沒事,那我們下一個。此處省略一萬字。面試官扭了扭嚴重負荷的頸椎:先到這裡吧,你先回去等通知。某人:好的。不出意外,某人等了一個月,等的望眼欲穿,也沒等到那個期待的電話。
  • 面經手冊 · 第16篇《碼農會鎖,ReentrantLock之公平鎖講解和實現》
    二、面試題謝飛機,小記,剛去冬巴拉泡完腳放鬆的飛機,因為耐克襪子丟了,罵罵咧咧的赴約面試官。「面試官」:咋了,飛機,怎麼看上去不高興。「謝飛機」:沒事,沒事,我心思我學的 synchronized 呢!「面試官」:那正好,飛機你會鎖嗎?「謝飛機」:啊。。。
  • 這篇 ReentrantLock 你可以看得懂!
    ReentrantLock 是一把可重入鎖和互斥鎖,它具有與 synchronized 關鍵字相同的含有隱式監視器鎖(monitor)的基本行為和語義,但是它比 synchronized不信你輸出試試啊!懶得輸出?就知道你懶得輸出,所以直接告訴你結論吧,結論就是自己試。試完了嗎?試完了我是不會讓你休息的,過來再試一下非公平鎖的測試和結論,知道怎麼試嗎?上面不是講過要給 ReentrantLock 傳遞一個參數的嗎?你想,傳 true 的時候是公平鎖,那麼反過來不就是非公平鎖了?其他代碼還用改嗎?不需要了啊。
  • 【第17期】面試官:Java中提供了synchronized,為什麼還要提供Lock呢?高並發
    很多小夥伴可能會聽說過,在Java 1.5版本中,synchronized的性能不如Lock,但在Java 1.6版本之後,synchronized做了很多優化,性能提升了不少。那既然synchronized關鍵字的性能已經提升了,那為何還要使用Lock呢?
  • ReentrantLock核心原理,絕對乾貨
    個人公眾號月伴飛魚,公眾號文章首發,轉載請註明出處,謝謝前言先來一個面試題:面試官:我看你熟悉ReentrantLock源碼,能講講他的中斷鎖是怎麼實現的麼?簡單應用ReentrantLock 的使用相比較 synchronized 會稍微繁瑣一點,所謂顯示鎖,也就是你在代碼中需要主動的去進行 lock 操作。
  • 深入理解ReentrantLock的實現原理
    來源:https://url.cn/5D162qMReentrantLock簡介ReentrantLock是Java在JDK1.5引入的顯式鎖,在實現原理和功能上都和內置鎖(synchronized)上都有區別,在文章最後我們再比較這兩個鎖。
  • 徹底理解ReentrantLock可重入鎖的使用
    一、簡介ReentrantLock常常對比著synchronized來分析,我們先對比著來看然後再一點一點分析。(1)synchronized是獨佔鎖,加鎖和解鎖的過程自動進行,易於操作,但不夠靈活。ReentrantLock也是獨佔鎖,加鎖和解鎖的過程需要手動進行,不易操作,但非常靈活。(2)synchronized可重入,因為加鎖和解鎖自動進行,不必擔心最後是否釋放鎖;ReentrantLock也可重入,但加鎖和解鎖需要手動進行,且次數需一樣,否則其他線程無法獲得鎖。
  • JAVA並發編程:concurrent提供了哪些比synchronized更高效的鎖
    在java.util.locks包下面提供了三種鎖,ReentrantLock、ReentrantReadWriteLock和StampedLock,下面一一講解這三種鎖的特點、實現方式以及應用。通用方法講解這三種鎖都實現了lock接口,先解讀一下Lock接口的方法及含義:void lock(); 方法,阻塞方法,直到可以獲取到鎖;void lockInterruptibly()方法,阻塞方法,直到可以獲取到鎖或者被其他線程中斷;boolean tryLock();嘗試獲取鎖,獲取不到立刻返回boolean
  • JAVA中synchronized與static synchronized 的區別
    1.synchronized與static synchronized 的區別        synchronized
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?下面這些是常被問到的面試題,如果你覺得還有一些經常提到的,我沒有寫出來的,歡迎補充。J2SE基礎:1. 九種基本數據類型的大小,以及他們的封裝類。2. Switch能否用string做參數?3. equals與==的區別。4. Object有哪些公用方法?
  • 面試官:你工作3年了,ArrayList是線程不安全都沒掌握,不應該啊
    面試時,也有不少面試官會針對此知識點考察求職者。小愛最近又去面試了,最近到某知名網際網路公司面試,做了筆試題後,面試官剛好問ArrayList是線程安全還是非線程安全?小愛說是非線程安全,面試官問,你能說說為什麼是非線程安全嗎?
  • volatile和synchronized到底啥區別?多圖文講解告訴你
    文章,有個朋友微群裡問我,還是不能理解 volatile 和 synchronized 二者的區別, 他的問題主要可以歸納為這幾個:volatile 與 synchronized 在處理哪些問題是相對等價的?
  • Java中可重入鎖ReentrantLock原理剖析
    接下來,我們將圍繞lock和unlock這兩個方法,來介紹整個ReentrantLock是怎麼工作的。NonfairSync和FairSync兩個類繼承自Sync,實現了lock方法,然後分別公平搶佔和非公平搶佔針對tryAcquire有不同的實現。
  • 工作六年總結的Java面試題與經驗
    首先你要知道,面試官的提問和你簡歷上寫的內容是緊密聯繫的,所以你簡歷上寫的技能一定要會。Java基礎、多線程、IO與NIO、虛擬機、設計模式HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實現ArrayList、LinkedList、Vector的區別HashMap和ConcurrentHashMap的區別ConcurrentHashMap是怎麼實現線程安全的synchronized、Lock
  • 因為不知道Java的CopyOnWriteArrayList,面試官讓我回去等通知
    hello,同學們,大家好,我是沉默王二,在我為數不多的面試經歷中,有一位姓馬的面試官令我印象深刻,九年過去了,我還能記得他為數不多的發量。老馬:「兄弟,ArrayList 是線程安全的嗎?」王二:「不是啊。」老馬:「那有沒有線程安全的 List?」王二:「有啊,Vector。」老馬:「還有別的嗎?」
  • 深入分析synchronized底層加鎖的原理
    3、然後wait和notify關鍵字的實現也是依託於monitor實現的,有線程執行wait之後,自己會加入一個waitset中等待喚醒獲取鎖,notifyall操作會從monitor的waitset中喚醒所有的線程,讓他們競爭獲取鎖。
  • 面試官經常問的synchronized實現原理和鎖升級過程,你真的了解嗎
    本篇文章主要從字節碼和JVM底層來分析synchronized實現原理和鎖升級過程,其中涉及到了簡單認識字節碼、對象內部結構以及ObjectMonitor等知識點。從字節碼角度分析synchronized實現從JVM規範中可以了解到,無論是synchronized修飾方法(實例/靜態方法)還是代碼塊都是基於進入(entry)和退出(exit)monitor對象來實現,但是兩種修飾方式在字節碼層面實現上有著很大區別。