1. 程式人生 > >Java併發程式設計札記-(三)JUC原子類-06JDK1.8新增:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator

Java併發程式設計札記-(三)JUC原子類-06JDK1.8新增:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator

DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder是JDK1.8新增的部分,是對AtomicLong等類的改進。比如LongAccumulator與LongAdder在高併發環境下比AtomicLong更高效。本文以LongAdder為例,學習這些類。

API中是這麼介紹的:LongAdder中會維護一組(一個或多個)變數,這些變數加起來就是要以原子方式更新的long型變數。當更新方法add(long)線上程間競爭時,該組變數可以動態增長以減緩競爭。方法sum()返回當前在維持總和的變數上的總和。與AtomicLong相比,LongAdder更多地用於收集統計資料,而不是細粒度的同步控制。在低併發環境下,兩者效能很相似。但在高併發環境下,LongAdder有著明顯更高的吞吐量,但是有著更高的空間複雜度。

outline

//建構函式
LongAdder()
    //建立初始和為零的新加法器。

//方法摘要
void    add(long x)
    //新增給定的值。
void    decrement()
    //相當於add(-1)。
double  doubleValue()
    //在擴充套件原始轉換之後返回sum()as double。
float   floatValue()
    //在擴充套件原始轉換之後返回sum()as float。
void    increment()
    //相當於add(1)。
int intValue()
    //返回sum()作為int一個基本收縮轉換之後。
long longValue() //相當於sum()。 void reset() //重置將總和保持為零的變數。 long sum() //返回當前的總和。 long sumThenReset() //等同於sum()後面的效果reset()。 String toString() //返回。的字串表示形式sum()。

例1:使用LongAdder實現long型變數的原子訪問和更新

Java併發程式設計札記-(三)JUC原子類-02原子方式更新單個變數一文中,例1:long型變數的原子訪問和更新使用了AtomicLong實現了原子方式更新long型變數,本文對例子稍作修改。

將計數器類Counter修改為如下

class Counter {
    private static LongAdder counter = new LongAdder();

    public static long addOne() {
        counter.add(1);
        return counter.sum();
    }
}

數次執行例1:long型變數的原子訪問和更新中的測試程式,,發現結果全部為計數器值最終值為100。說明說明次計數器在多執行緒環境下可用,LongAdder實現long型變數的原子訪問和更新。

實現原理
與其他原子類一樣,LongAdder也是基於CAS實現的。

LongAdder可以代替AtomicLong嗎

當然不能。在上面已經提到,與AtomicLong相比,LongAdder更多地用於收集統計資料,而不是細粒度的同步控制。而且,LongAdder只提供了add(long)和decrement()方法,想要使用cas方法還是要選擇AtomicLong。

DoubleAdder、LongAccumulator、DoubleAccumulator與LongAdder很相似,就不多做介紹了。

本文就講到這裡,想了解Java併發程式設計更多內容請參考:

END.