1. 程式人生 > 其它 >CAS(compare and swap)

CAS(compare and swap)

首先什麼是原子操作?

原子本意是“不能被進一步分割的最小粒子”,而原子操作意為”不可被中斷的一個或一系列操作”;

處理器如何實現原子操作?

  1. 首先處理器會自動保證基本的記憶體操作的原子性:處理器保證從系統記憶體當中讀取或者寫入一個位元組是原子的,意思是當一個處理器讀取一個位元組時,其他處理器不能訪問這個位元組的記憶體地址。
  2. 匯流排鎖保證原子性:所謂匯流排鎖就是使用處理器提供的一個LOCK#訊號,當一個處理器在總線上輸出此訊號時,其他處理器的請求將被阻塞住,那麼該處理器可以獨佔使用共享記憶體。
  3. 快取鎖定保證原子性:鎖住匯流排的消耗太大,於是有了快取鎖,在Lock期間處理器快取的記憶體區域會被鎖定,其他處理其無法更改該塊記憶體中的資料
CAS(compare and swap),比較和交換,是原子操作的一種,可用於在多執行緒程式設計中實現不被打斷的資料交換操作,從而避免多執行緒同時改寫某一資料時由於執行順序不確定性以及中斷的不可預知性產生的資料不一致問題。 該操作通過將記憶體中的值與指定資料進行比較,當數值一樣時將記憶體中的資料替換為新的值
現代的大多數CPU都實現了CAS,它是一種==無鎖==(lock-free),且==非阻塞==的一種演算法,保持資料的一致性

CAS的思想很簡單:三個引數,一個當前記憶體值V、舊的預期值A、即將更新的值B,當且僅當預期值A和記憶體值V相同時,將記憶體值修改為B並返回true,否則什麼都不做,並返回false。

cas步驟還原:

  • 需要傳遞三個引數 1.當前執行緒中獲取的舊值 2.新值 3.記憶體地址中的值
  • 迴圈比較舊值和記憶體地址中的值,直到比較成功為止,即使失敗,舊值是用volatile修飾的,保證一旦發生改變,能夠被其他執行緒所察覺.然後再進行比較.
CAS存在一個很明顯的問題,即ABA問題。如果變數V初次讀取的時候是A,並且在準備賦值的時候檢查到它仍然是A,那能說明它的值沒有被其他執行緒修改過了嗎?如果在這段期間它的值曾經被改成了B,然後又改回A,那CAS操作就會誤認為它從來沒有被修改過