CAS全稱CompareAndSwap(比較并交換),是cpu的指令,調用時不涉及上下文的切換。Java中屬于樂觀鎖的一種,具體流程如下圖:
具體的實現使用的是Unsafe類去調用native修飾的compareAndSwap方法,4個字段分別是對象實例,字段偏移量,字段期望值,字段新值
可以通過反射的方式獲取UnSafe類
通過傳入變量獲取偏移量
具體調用實例:
CAS存在的缺陷:
1、自旋長時間不成功會給cpu帶來非常大的開銷
2、只能保證一個共享變量原子操作
3、存在ABA問題
ABA問題:
當有多個線程對一個原子類進行操作的時候,某個線程在短時間內將原子類的值 A 修改為 B ,又馬上將其修改為A ,此時其他線程不感知,還是會修改成功,具體過程如圖:

ABA問題的解決方式可以通過添加版本號來解決,即每次修改數據時,比較版本號的值。每次修改完成后,版本號+1,通過這種方式來保證數據的唯一,解決ABA問題
在java.util.concurrent.atomic包里提供了一組原子操作類:
基本類型:AtomicInteger、AtomicLong、AtomicBoolean;
引用類型:AtomicReference、AtomicStampedRerence、AtomicMarkableReference;
數組類型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
基本類型:AtomicInteger、AtomicLong、AtomicBoolean;
引用類型:AtomicReference、AtomicStampedRerence、AtomicMarkableReference;
數組類型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray