標籤:執行 擷取 nbsp 重點 期望 組成 details 允許 unsafe
文章目錄
1、 CPU指令對CAS的支援(CPU的cas指令是原子的)
或許我們可能會有這樣的疑問,假設存在多個線程執行CAS操作並且CAS的步驟很多,有沒有可能在判斷V和E相同後,正要賦值時,切換了線程,更改了值。造成了資料不一致呢?答案是否定的,因為CAS是一種系統原語,原語屬於作業系統用語範疇,是由若干條指令組成的,用於完成某個功能的一個過程,並且原語的執行必須是連續的,在執行過程中不允許被中斷,也就是說CAS是一條CPU的原子指令,不會造成所謂的資料不一致問題。
2、 並發包中的原子操作類(Atomic系列)
通過前面的分析我們已基本理解了無鎖CAS的原理並對Java中的指標類Unsafe類有了比較全面的認識,下面進一步分析CAS在Java中的應用,即並發包中的原子操作類(Atomic系列),從JDK 1.5開始提供了java.util.concurrent.atomic包,在該包中提供了許多基於CAS實現的原子操作類,用法方便,效能高效,主要分以下4種類型。
可以發現AtomicInteger原子類的內部幾乎是基於前面分析過Unsafe類中的CAS相關操作的方法實現的,這也同時證明AtomicInteger是基於無鎖實現的,這裡重點分析自增操作實現過程,其他方法自增實現原理一樣。
3、 CAS的ABA問題及其解決方案
假設這樣一種情境,當第一個線程執行CAS(V,E,U)操作,在擷取到當前變數V,準備修改為新值U前,另外兩個線程已連續修改了兩次變數V的值,使得該值又恢複為舊值,這樣的話,我們就無法正確判斷這個變數是否已被修改過,如
這就是典型的CAS的ABA問題,一般情況這種情況發現的機率比較小,可能發生了也不會造成什麼問題,比如說我們對某個做加減法,不關心數位過程,那麼發生ABA問題也沒啥關係。但是在某些情況下還是需要防止的,那麼該如何解決呢?在Java中解決ABA問題,我們可以使用以下兩個原子類
AtomicStampedReference類
參考文章:
1、JAVA中的CAS
Java CAS總結