樂觀鎖之版本號機制和CAS


---恢復內容開始---

  樂觀鎖:每次去拿數據的時候,都認為別人不會修改,不會加鎖,但在更新的時候會去判斷一下,此期間別人有沒有更新數據,版本號機制和CAS算法就用到樂觀鎖,參考了https://blog.csdn.net/u011381576/article/details/79922538;

  舉一個版本號的例子,

  數據表中除了數據還有一個version字段,更新數據時version字段會加一,

  假設線程A在讀取數據和version(version = 1)的期間,有另一個線程B也讀取了version(version = 1),

  線程A修改數據,更新version(version = 2),提交更新時,在更新version前讀取的version(version = 1)和當前數據表中的version(version = 1)相同,則更新成功

  線程B也修改數據,更新version(version = 2)提交更新時,由於讀取時version = 1 而當前數據表version = 2 不相等,則更新失敗, 

  CAS 是什么?

  CAS(compare and swap) 比較並交換,有三個操作數,內存地址V ,預期值B,要替換得到的目標子A;

  CAS指令執行時,比較內存地址V與預期值B是否相等,若相等則將A賦給B,(不相等則會循環比較直到相等)整個比較賦值操作是一個原子操作;

  CAS有三個缺點

  1,CAS自旋操作:當內存地址V與預期值B不相等時會一直循環比較直到相等,

  2,只能保證一個共享變量的原子操作,

  3,出現ABA問題:如果內存值初V次讀取的時候為A,在將要賦值的時候再次檢查還是A,能說明V沒有改變過嗎?

  有一種可能時當讀取內存值V的時候時A,有一個線程將A改為B,后有改為A,CAS會誤認為內存值V沒有改變,這稱為CAS操作的ABA問題;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM