首頁 > Java > Java面試題 > java面試-樂觀鎖與悲觀鎖

java面試-樂觀鎖與悲觀鎖

王林
發布: 2020-11-27 15:38:07
轉載
10148 人瀏覽過

java面試-樂觀鎖與悲觀鎖

面試題目:

樂觀鎖定與悲觀鎖定的差異

(學習影片分享:java教學影片

一、樂觀鎖

總是認為不會產生並發問題,每次去取資料的時候總認為不會有其他執行緒對資料進行修改,因此不會上鎖,但是更新時會判斷其他執行緒在這之前有沒有對資料進行修改,一般會使用版本號機製或CAS運算實作

version方式:

一般是在資料表中加上一個資料版本號version字段,表示資料被修改的次數,當資料被修改時,version值會加一。當執行緒A要更新資料值時,在讀取資料的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為目前資料庫中的version值相等時才更新,否則重試更新操作,直到更新成功。

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
登入後複製

(相關面試題推薦:java面試題目及答案

CAS操作方式:

即compare and swap 或compare and set,涉及到三個操作數,資料所在的記憶體值,預期值,新值。當需要更新時,判斷目前記憶體值與先前取到的值是否相等,若相等,則以新值更新,若失敗則重試,一般情況下為自旋操作,即不斷的重試。

二、悲觀鎖定

總是假設最壞的情況,每次取資料時都認為其他執行緒會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他執行緒想要存取資料時,都需要阻塞掛起。可以依靠資料庫實現,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在Java中,synchronized的想法也是悲觀鎖。

三、適用場景

悲觀鎖定:比較適合寫入操作比較頻繁的場景,如果出現大量的讀取操作,每次讀取的時候都會加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。

樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新取得數據,這樣會增加大量的查詢操作,降低了系統的吞吐量。

總結:兩種所各有優缺點,讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。

相關推薦:java入門教學

以上是java面試-樂觀鎖與悲觀鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板