CAS
Compare And Swap.比較並交換.java中的同步器就是基於CAS技術實現的,為什麼它能保證操作的同步性呢?因為是原子操作的一種,所以可以在多執行緒環境下來實現資料的交換操作不被打斷.
CAS的缺陷
ABA問題:
第一個執行緒來讀取變數A時被掛起;第二個執行緒過來操作A,將A賦值為B之後,並重新賦值為A;執行緒二完成操作;此時,對於執行緒一來說,所看到變數A的值是沒有變化的,但是實際上變數A已經修改了兩次.
上述情況還不是最壞情況.如果在一個佇列中,有三個指標元素分別順序的指向了三個記憶體地址.進行.當第一個執行緒操作第一個位置的指標元素時,執行緒被掛起.執行緒二過來進行了一大堆的pop和push操作,這時第一個位置的指標元素的資料.
CAS下ABA問題及優化方案
CAS的優點
它比鎖快.
Disruptor論文中講述了一個實驗:
這個測試程式呼叫了一個函式,該函式會對一個64位的計數器迴圈自增5億次。
機器環境:2.4G 6核
運算: 64位的計數器累加5億次
Method Time (ms)
Single thread 300
Single thread with CAS 5,700
Single thread with lock 10,000
Single thread with volatile write 4,700
Two threads with CAS 30,000
Two threads with lock 224,000
所以,鎖的效能相對於CAS操作更加低.