CAS 介紹
CAS 操作包含三個操作數——內存位置(V)、預期原值(A)和新值(B)。 如果內存位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新爲新值 ,否則處理器不做任何操作。
Java 併發包
JUC 併發包中原子類,都存放在 java.util.concurrent.atomic 類路徑下。
Unsafe 類
Unsafe 是位於 sun.misc 包下的一個類,Unsafe 提供了CAS 方法,直接通過 native 方式調用了底層的 CPU 指令。
CAS 缺點
1、ABA 問題。JDK 提供了兩個類 AtomicStampedReference、AtomicMarkableReference 來解決 ABA 問題。
2、只能保證一個共享變量的原子操作。規避方法爲:使用 AtomicReference 把多個共享變量合併成一個共享變量來操作。
3、循環時間長開銷大。高併發下 N 多線程同時去操作一個變量,會造成大量線程 CAS 失敗。