常見的樂觀鎖實現方式有兩種,分別是:1、版本號機制;2、CAS算法。其中,通過版本號機制實現樂觀鎖是最經典的方法。版本號機制一般是在數據表中加上一個數據庫版本號version字段。
實現方式:
(推薦學習:mysql教程)
1、版本號機制
一般是說在數據表中加上一個數據庫版本號version字段,在表述數據被修改的次數當數據被修改時,它的version 值會加1。
如:
當然線程A需要更新數據值時,在讀取數據的同時也會讀取 version 值,在提交更新時,若剛才讀取到的 version 值為當前數據庫中的 version 值相等時才更新,否則重試更新操作,直到更新成功。
2、CAS 算法
CAS(compare and swap) 比較并交換,有三個操作數,內存地址V ,預期值B,要替換得到的目標子A。
CAS指令執行時,比較內存地址V與預期值B是否相等,若相等則將A賦給B,(不相等則會循環比較直到相等)整個比較賦值操作是一個原子操作。
CAS缺點:
(1)循環時間開銷大:當內存地址V與預期值B不相等時會一直循環比較直到相等;
(2)只能保證一個共享變量的原子操作;
(3)如果一個變量V初次讀取的時候是A值,并且在準備賦值的時候檢查到它仍然是A值,那么我們就能說明它的值沒有被其他線程修改過嗎?很明顯不是,因為在這段時間內它的值可能被改為其他值,然后又被改回A,那CAS操作就會認為它從來沒被改過,這個問題就被稱為 CAS 操作的“ABA” 問題;
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END