一、LongAccumulator類
1.和LongAdder之間的關系
LongAdder類是LongAccumulator的一個特例,我們看一下LongAccumulator的一個構造方法
public LongAccumlator(LongBinaryOperator accumulatorFunction,long identity) {
this.function = accumulatorFunction;
base = this.identity = identity;
}
其中引數identity是累加器的初始值;引數型別LongBinaryOperator是一種相當于二目運算子的類,它的輸入是兩個Long型數,回傳也是一個Long型數字,我們看一下這個介面定義
public interface LongBinaryOperator {
long applyAsLong(long left,long right);
}
下面來看一下兩個類的等價形式
LongAdder adder = new LongAdder();
LongAccumulator accumulator = new LongAccumulator(new LongBinaryOperator() {
@Override
public long applyAsLong(long left,long right) {
return left + right;
}
}
LongAccumulator相比于LongAdder,可以為累加器提供非0的初始值,后者只能從0開始累加,并且前者可以自定義累加規則,我們只需要實作這個介面,然后在介面內部的方法內,自定累加規則即可, 從下面的代碼看一下LongAccumulator的accumulate方法和LongAdder類的add方法
//LongAdder的add方法
public void add(long x){
Cell[] as;
long b;
long v;
int m;
Cell a;
if(as = cells) != null || !casBase(b = base,b+x)) {
boolean uncontended = true;
if(as == null || (m = as.length -1)<0 || (a = as[getProbe() & m]) == null || !(uncontended = a.cas(v = a.value,v + x))){
longAccumulator(x,null,uncontended);
}
}
}
//LongAccumulator的accumulate方法
public void accumulate(long x){
Cell[] as;
long b;
long v;
int m;
Cell a;
if(as = cells) != null || r = function.applyAsLong(b = base,x))!= b && !casBase(b,r) {
boolean uncontended = true;
if(as == null || (m = as.length -1)<0 || (a = as[getProbe() & m]) == null || !(uncontended = (r = function.applyAsLong(v = a.value,x)) == v|| a.cas(v,r))){
longAccumulator(x,null,uncontended);
}
}
呼叫casBase的時候后者傳遞的是b+x,前者使用了r=function.applyAsLong(b = base,x)來計算 前者在呼叫longAccumulator時傳遞的是function,而后者是null,從下面的代碼看出
else if(casBase(v = base,((fn==null)?v+x:fn.applyAsLong(v,x)))){
break;
}
當fu為null時,就是用了x+v的加法運算,這時候等價于LongAdder,當fn不為null則使用傳遞的fu函式計算
2.總結:可以看到該類提供的功能更加一般化
二、原始碼:
所在包:com.ruigege.AtomicOperationClass4 https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050 博客園:https://www.cnblogs.com/ruigege0000/ 歡迎關注微信公眾號:傅里葉變換,個人賬號,僅用于技術交流 
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245985.html
標籤:其他
