CASjava
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操做更加低.測試