---恢復內容開始---
樂觀鎖:每次去拿數據的時候,都認為別人不會修改,不會加鎖,但在更新的時候會去判斷一下,此期間別人有沒有更新數據,版本號機制和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問題;
