現在的無鎖設計得益於CPU對CAS操作的支援。所以想理解無鎖設計首先明白什麼是CAS。
CAS是Compare and Swap的縮寫,翻譯成中文就是“比較並交換”。它的實現是這樣的:有三個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值和記憶體值相同時,將記憶體值V修改為B,否則什麼都不做。
下面舉一個例子來解釋一下CAS演算法。假設現在有t1和t2兩個執行緒都同時去訪問同一個變數10。所以他們會把主記憶體的值完全複製一份到自己的工作記憶體空間,所以t1和t2執行緒的預期值都是10。
假設t1和t2競爭時t1成功的將變數值修改為了11,然後寫到了記憶體中。t2執行更新時發現記憶體值變成了11與預期值10不一致,也就是這次更新失敗了,然後重新執行剛才的操作。
CAS操作類似於commit-retry模式。當同步衝突出現的機會比較少時,效能會得到很大的提升。
雖然CAS高效的解決了原子操作,但是還是存在三大問題:ABA問題、自旋CAS迴圈時間長開銷大、一次CAS只能保證一個變數的原子操作。針對這三個問題,不同語言都給出瞭解決方案,想詳細瞭解的可以查詢自己關注開發語言的解決方案。
由於對硬體知識缺乏,想了解cpu是如何實現的CAS的可以檢視CPU相關資料。
現在的無鎖設計得益於CPU對CAS操作的支援。所以想理解無鎖設計首先明白什麼是CAS。
CAS是Compare and Swap的縮寫,翻譯成中文就是“比較並交換”。它的實現是這樣的:有三個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值和記憶體值相同時,將記憶體值V修改為B,否則什麼都不做。
下面舉一個例子來解釋一下CAS演算法。假設現在有t1和t2兩個執行緒都同時去訪問同一個變數10。所以他們會把主記憶體的值完全複製一份到自己的工作記憶體空間,所以t1和t2執行緒的預期值都是10。
假設t1和t2競爭時t1成功的將變數值修改為了11,然後寫到了記憶體中。t2執行更新時發現記憶體值變成了11與預期值10不一致,也就是這次更新失敗了,然後重新執行剛才的操作。
CAS操作類似於commit-retry模式。當同步衝突出現的機會比較少時,效能會得到很大的提升。
雖然CAS高效的解決了原子操作,但是還是存在三大問題:ABA問題、自旋CAS迴圈時間長開銷大、一次CAS只能保證一個變數的原子操作。針對這三個問題,不同語言都給出瞭解決方案,想詳細瞭解的可以查詢自己關注開發語言的解決方案。
由於對硬體知識缺乏,想了解cpu是如何實現的CAS的可以檢視CPU相關資料。