Java多線程/併發17、簡述CAS 操作

摘錄網上一些文章

什麼是CAS

CAS,Compare and Swap即比較並交換。
java.util.concurrent包藉助CAS實現了區別於synchronized同步鎖的一種樂觀鎖。樂觀鎖就是每次去取數據的時候都樂觀的認爲數據不會被修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間數據有沒有更新。
CAS有3個操作數:內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改爲B,否則什麼都不做。
CAS的關鍵點在於,系統在硬件層面保證了比較並交換操作的原子性,處理器使用基於對緩存加鎖或總線加鎖的方式來實現多處理器之間的原子操作。

CAS的優缺點

CAS由於是在硬件層面保證的原子性,不會鎖住當前線程,它的效率是很高的。
CAS雖然很高效的實現了原子操作,但是它依然存在三個問題。

  1. ABA問題。CAS在操作值的時候檢查值是否已經變化,沒有變化的情況下才會進行更新。但是如果一個值原來是A,變成B,又變成A,那麼CAS進行檢查時會認爲這個值沒有變化,但是實際上卻變化了。ABA問題的解決方法是使用版本號。在變量前面追加上版本號,每次變量更新的時候把版本號加一,那麼A-B-A就變成1A-2B-3A。從Java1.5開始JDK的atomic包裏提供了一個類AtomicStampedReference來解決ABA問題。

  2. 併發越高,失敗的次數會越多,CAS如果長時間不成功,會極大的增加CPU的開銷。因此CAS不適合競爭十分頻繁的場景。

  3. 只能保證一個共享變量的原子操作。當對多個共享變量操作時,CAS就無法保證操作的原子性,這時就可以用鎖,或者把多個共享變量合併成一個共享變量來操作。比如有兩個共享變量i=2,j=a,合併一下ij=2a,然後用CAS來操作ij。從Java1.5開始JDK提供了AtomicReference類來保證引用對象的原子性,你可以把多個變量放在一個對象裏來進行CAS操作。

發佈了142 篇原創文章 · 獲贊 554 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章