Java CAS總結

來源:互聯網
上載者:User

標籤:執行   擷取   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類

  • AtomicStampedReference原子類是一個帶有時間戳記的對象引用,在每次修改後,AtomicStampedReference不僅會設定新值而且還會記錄更改的時間。當AtomicStampedReference設定對象值時,對象值以及時間戳記都必須滿足期望值才能寫入成功,這也就解決了反覆讀寫時,無法預知值是否已被修改的窘境

 

 

參考文章:

1、JAVA中的CAS

 

Java CAS總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.