對cas演算法的理解
阿新 • • 發佈:2019-01-03
cas演算法主要關心3個值:記憶體值V,預期值A,要更新的新值B
如下圖所示:
注:t1,t2執行緒是同時更新同一變數56的值
因為t1和t2執行緒都同時去訪問同一變數56,所以他們會把主記憶體的值完全拷貝一份到自己的工作記憶體空間,所以t1和t2執行緒的預期值都為56。
假設t1在與t2執行緒競爭中執行緒t1能去更新變數的值,而其他執行緒都失敗。(失敗的執行緒並不會被掛起,而是被告知這次競爭中失敗,並可以再次發起嘗試)。t1執行緒去更新變數值改為57,然後寫到記憶體中。此時對於t2來說,記憶體值變為了57,與預期值56不一致,就操作失敗了(想改的值不再是原來的值)。
(上圖通俗的解釋是:CPU去更新一個值,但如果想改的值不再是原來的值,操作就失敗,因為很明顯,有其它操作先改變了這個值。)
就是指當兩者進行比較時,如果相等,則證明共享資料沒有被修改,替換成新值,然後繼續往下執行;如果不相等,說明共享資料已經被修改,放棄已經所做的操作,然後重新執行剛才的操作。容易看出 CAS 操作是基於共享資料不會被修改的假設,採用了類似於資料庫的 commit-retry 的模式。當同步衝突出現的機會很少時,這種假設能帶來較大的效能提升。