java cas

CAS 操做包含三個操做數 —— 內存位置(V)、預期原值(A)和新值(B)。 html

 

利用CPU的CAS指令,同時藉助JNI來完成Java的非阻塞算法。其它原子操做都是利用相似的特性完成的。而整個J.U.C都是創建在CAS之上的,所以對於synchronized阻塞算法,J.U.C在性能上有了很大的提高。java

 

CAS存在的問題算法

1.  ABA問題。經過遞增來避開ABA的問題,就是每次改變都不會重複。在JDK的java.util.concurrent.atomic包中提供了AtomicStampedReference來解決ABA問題,該類檢查了當前引用與當前標誌是否與預期相同,若是所有相等,纔會以原子方式將該引用和該標誌的值設爲新的更新值,這樣CAS操做中的比較就不依賴於變量的值了。異步

    https://www.cnblogs.com/549294286/p/3766717.html性能

2. 循環時間長開銷大。 自旋CAS若是長時間不成功,會給CPU帶來很是大的執行開銷atom

3. 只能保證一個共享變量的原子操做線程

Java的CAS會使用現代處理器上提供的高效機器級別原子指令,這些原子指令以原子方式對內存執行讀-改-寫操做,這是在多處理器中實現同步的關鍵(從本質上來講,可以支持原子性讀-改-寫指令的計算機器,是順序計算圖靈機的異步等價機器,所以任何現代的多處理器都會去支持某種能對內存執行原子性讀-改-寫操做的原子指令)。同時,volatile變量的讀/寫和CAS能夠實現線程之間的通訊。把這些特性整合在一塊兒,就造成了整個concurrent包得以實現的基石。若是咱們仔細分析concurrent包的源代碼實現,會發現一個通用化的實現模式:htm

  1. 首先,聲明共享變量爲volatile;
  2. 而後,使用CAS的原子條件更新來實現線程之間的同步;
  3. 同時,配合以volatile的讀/寫和CAS所具備的volatile讀和寫的內存語義來實現線程之間的通訊。
相關文章
相關標籤/搜索