【Java面試】一篇小故事理解 樂觀鎖與悲觀鎖

一直有聽說樂觀鎖和悲觀鎖這兩個名詞,但是一直沒有去了解他,今天特地去搜索了一下兩者的區別。

一篇小故事理解 樂觀鎖與悲觀鎖


看圖理解

還是先以一個故事來理解這兩個名詞。

A是幼兒園老師,又到了小朋友玩玩具的時間了,今天A給小朋友們帶了新玩具,讓小朋友們一起玩,一開始小朋友們都是很有秩序的,老師也很開心。
樂觀鎖1
快樂得時光總是短暫的,玩着玩着,其中兩個小朋友們就因爲誰先玩玩具的問題哭起來了,老師只要上去安慰兩個在哭的小朋友。
樂觀鎖2
第二天,鑑於上次的表現,A對他們進行了新的安排。讓他們一個個排隊玩,這樣小朋友應該就不會吵架了吧。
悲觀鎖1
但是有的小朋友太貪玩了,一直不走,後面的小朋友就只能一直等着,因爲A沒有規定玩的時間。
悲觀鎖2

總結

悲觀鎖

總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖(共享資源每次只給一個線程使用,其它線程阻塞,用完後再把資源轉讓給其它線程)。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。


樂觀鎖

總是假設最好的情況,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的。

參考資料

面試必備之樂觀鎖與悲觀鎖.md#何謂悲觀鎖與樂觀鎖


文章中出現的任何錯誤歡迎指正,共同進步!

最後做個小小廣告,有對WEB開發和網絡安全感興趣的,可以加羣一起學習和交流!

交流羣
QQ:425343603

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