最通俗易懂的乐观锁与悲观锁原理及实现
生活随笔
收集整理的這篇文章主要介紹了
最通俗易懂的乐观锁与悲观锁原理及实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自??最通俗易懂的樂觀鎖與悲觀鎖原理及實現
一、樂觀鎖
?總是認為不會產生并發問題,每次去取數據的時候總認為不會有其他線程對數據進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數據進行修改,一般會使用版本號機制或CAS操作實現。
?version方式:一般是在數據表中加上一個數據版本號version字段,表示數據被修改的次數,當數據被修改時,version值會加一。當線程A要更新數據值時,在讀取數據的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前數據庫中的version值相等時才更新,否則重試更新操作,直到更新成功。
核心SQL代碼:
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};?
?CAS操作方式:即compare and swap 或者 compare and set,涉及到三個操作數,數據所在的內存值,預期值,新值。當需要更新時,判斷當前內存值與之前取到的值是否相等,若相等,則用新值更新,若失敗則重試,一般情況下是一個自旋操作,即不斷的重試。
一、悲觀鎖
?總是假設最壞的情況,每次取數據時都認為其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起。可以依靠數據庫實現,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在Java中,synchronized的思想也是悲觀鎖。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的最通俗易懂的乐观锁与悲观锁原理及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这个应用也能帮你跳过开屏广告跳过开屏广告
- 下一篇: 受 Epic Games 裁员影响,旗下