面试中的最常被问到的两种锁
文章目錄
- 面試中的最常被問到的兩種鎖
- **鎖的分類**
- **樂觀鎖**
- **悲觀鎖**
面試中的最常被問到的兩種鎖
公眾號后臺領取更多 面試必看資料
面試中經常被問到的鎖到底是哪兩種鎖呢?接下來我們就得介紹下樂觀鎖和悲觀鎖了。那我們我就來了解一波吧!
鎖的分類
1.公平鎖/非公平鎖
2.可重入鎖
3.獨享鎖/共享鎖
4.互斥鎖/讀寫鎖
5.樂觀鎖/悲觀鎖
6.分段鎖
7.偏向鎖/輕量級鎖/重量級鎖8.自旋鎖
樂觀鎖
所謂的樂觀,實際上是相對于悲觀鎖來說,我們先看一下百度百科中的解釋。
樂觀鎖機制采取了更加寬松的加鎖機制。悲觀鎖大多數情況下依靠數據庫的鎖機制實現,以保證操作最大程度的獨占性。但隨之而來的就是數據庫 性能的大量開銷, 特別是對長事務而言,這樣的開銷往往無法承受。相對悲觀鎖而言,樂觀鎖更傾向于開發運用。
上面的內容都是樂觀鎖在百度百科中的解釋,我們如果想要理解這個鎖,是需要我們去找一個場景來進行解釋的。
我們就從最經典的案例“老王取錢”來說,
**圖中有三個存在,分別表示老王,和老王賬戶,還有一個就是版本信息。版本信息默認是1,**這時候老王要買點東西,結果發現錢不太夠,那就去銀行取點錢去唄,果斷的來了銀行。
然后告訴柜員,取5000塊錢,然后柜員就會從他的賬戶余額里面扣除5000,就是-5000
這時候版本信息是1,但是我們對金額做了修改之后,要把版本信息換成2,因為現在保存的版本信息是1,柜員查看的時候也是1,老王取錢了, 就想著修改成2。
但是,就在這個時候,來事了,老王的媳婦出去買衣服,發現身上錢不太夠,就打算取點錢,就來了另外一家銀行,這時候老王錢拿到了,但是柜員還沒修改版本信息
就是這樣子的,
這時候告訴柜員要取錢,柜員就回去讀卡了,發現版本信息是1,
然后就在這時候,老王這頭,柜員打算把這-5000的操作記錄到數據庫中,然后把版本信息變成2,這時候校驗數據庫中的版本信息還是1,所以, 錄入成功了,就穩定的把這個信息改成了2,
這時候就是這樣的
錢也到手了,老王美滋滋的拿錢走了。
然后在老王媳婦這邊的柜員在操作的時候就會出現問題了,之前讀出來的賬戶信息版本是1,但是他要去操作的時候,發現不對呀,有人修改過呀, 就會出現這種情況。
但是他想去修改的時候人家現在默認的是2,這時候他在比對的時候是1和2了,然后就想著在次提交,這時候,操作完成不了,這就太尷尬了
這種情況就是證明不能讓老王媳婦這邊的柜員,拿著一版本的數據去吧老王那邊的數據覆蓋掉。這種其實就相當于是一種樂觀鎖的提現。
上面的圖解就是樂觀鎖,
樂觀鎖,大多是基于數據版本( Version )記錄機制實現。 何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個 “version” 字段來實現。 讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對, 如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。
那什么又是悲觀鎖呢?我們接下來在說說什么是悲觀鎖。
悲觀鎖
慣例,先來看看百度百科中的解釋
悲觀鎖,正如其名,具有強烈的獨占和排他特性。
它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度, 因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性, 否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。
因為悲觀鎖總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。
案例來襲:“工資的那點事”
這天老王開工資了,工資已經到賬了,這時候老王沒開短信提醒,得去看看錢到還是沒到?
然后就告訴柜員,幫我查查卡里有多少錢?
正在柜員查錢的時候,老王媳婦又來取錢了,上次買的衣服不好看,再買點,錢不夠就來銀行了。
這時候老王正在查錢,而悲觀鎖的意思就是我在讀的時候,我是鎖著的你是看不到的,可以這么理解。
這時候老王媳婦就處于等待的狀態,這個樣子就是相當于悲觀鎖。
因為悲觀鎖就是當我們去獲取數據的時候,不論我們有沒有打算去修改,悲觀鎖都會認為我們一定會去修改這個數據,所以 他會把這個數據直接鎖死,其他的人想操作操作,那你就阻塞,直到輪到你獲取鎖為止。
悲觀鎖和樂觀鎖的區別也就在這里。
樂觀鎖 總是認為不會產生并發問題,每次去取數據的時候總認為不會有其他線程對數據進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數據進行修改,一般會使用版本號機制或CAS操作實現。
悲觀鎖總是假設最壞的情況,每次取數據時都認為其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起
關于樂觀鎖和悲觀鎖,你了解了么?
操作實現。**
悲觀鎖總是假設最壞的情況,每次取數據時都認為其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起
關于樂觀鎖和悲觀鎖,你了解了么?
真誠地邀請您加入我們的大家庭,在這里不僅有技術知識分享,還有博主們之間的互幫互助.還不定期發紅包,每月更有抽獎環節,游戲機和實體書相贈(包郵),讓我們抱團取暖,抱團內卷.打造美好C站.期待您的加入.
總結
以上是生活随笔為你收集整理的面试中的最常被问到的两种锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020清华大学计算机复试线,2020清
- 下一篇: P1571 眼红的Medusa