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.