JDK8中新增原子性操作類LongAccumulator

一、 LongAccumulator類原理探究

LongAdder類是LongAccumulator的一個(gè)特例,LongAccumulator提供了比LongAdder更強(qiáng)大的功能,如下構(gòu)造函數(shù)其中accumulatorFunction一個(gè)雙目運(yùn)算器接口,根據(jù)輸入的兩個(gè)參數(shù)返回一個(gè)計(jì)算值,identity則是LongAccumulator累加器的初始值啸澡。

    public LongAccumulator(LongBinaryOperator accumulatorFunction,
                           long identity) {
        this.function = accumulatorFunction;
        base = this.identity = identity;
    }
public interface LongBinaryOperator {

       //根據(jù)兩個(gè)參數(shù)計(jì)算返回一個(gè)值
       long applyAsLong(long left, long right);
}

LongAdder其實(shí)是LongAccumulator的一個(gè)特例袖订,調(diào)用LongAdder相當(dāng)使用下面的方式調(diào)用LongAccumulator。

LongAdder adder = new LongAdder();
    LongAccumulator accumulator = new LongAccumulator(new LongBinaryOperator() {
        
        @Override
        public long applyAsLong(long left, long right) {
            return left + right;
        }
    }, 0);

LongAccumulator相比于LongAdder可以提供累加器初始非0值嗅虏,后者只能默認(rèn)為0洛姑,另外前者還可以指定累加規(guī)則比如不是累加而是相乘,只需要構(gòu)造LongAccumulator時(shí)候傳入自定義雙面運(yùn)算器就OK皮服,后者則內(nèi)置累加的規(guī)則楞艾。

從下面代碼知道LongAccumulator相比于LongAdder不同在于casBase時(shí)候后者傳遞的是b+x,前者則是調(diào)用了r = function.applyAsLong(b = base, x)來計(jì)算。


    public void add(long x) {
        Cell[] as; long b, 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)))
                longAccumulate(x, null, uncontended);
        }
    }
    
    public void accumulate(long x) {
        Cell[] as; long b, v, r; 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)))
                longAccumulate(x, function, uncontended);
        }
    }

另外前者調(diào)用longAccumulate時(shí)候傳遞到是function,而后者是null龄广,從下面代碼可知當(dāng)fn為null時(shí)候就是使用v+x加法運(yùn)算這時(shí)候就等價(jià)于LongAdder硫眯,fn不為null時(shí)候則使用傳遞的fn函數(shù)計(jì)算,如果fn為加法則等價(jià)于LongAdder择同;

  else if (casBase(v = base, ((fn == null) ? v + x :
                                        fn.applyAsLong(v, x))))
                break;                          // Fall back on using base

更詳細(xì)的說明敬請期待 Java并發(fā)編程基礎(chǔ)之并發(fā)包源碼剖析 一書的出版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末两入,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敲才,更是在濱河造成了極大的恐慌裹纳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紧武,死亡現(xiàn)場離奇詭異痊夭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脏里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虹曙,“玉大人迫横,你說我怎么就攤上這事≡吞迹” “怎么了矾踱?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疏哗。 經(jīng)常有香客問我呛讲,道長,這世上最難降的妖魔是什么返奉? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任贝搁,我火速辦了婚禮,結(jié)果婚禮上芽偏,老公的妹妹穿的比我還像新娘雷逆。我一直安慰自己,他們只是感情好污尉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布膀哲。 她就那樣靜靜地躺著往产,像睡著了一般。 火紅的嫁衣襯著肌膚如雪某宪。 梳的紋絲不亂的頭發(fā)上仿村,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音兴喂,去河邊找鬼蔼囊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞻想,可吹牛的內(nèi)容都是我干的压真。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蘑险,長吁一口氣:“原來是場噩夢啊……” “哼滴肿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佃迄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泼差,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呵俏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堆缘,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年普碎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼肥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麻车,死狀恐怖缀皱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情动猬,我是刑警寧澤啤斗,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站赁咙,受9級特大地震影響钮莲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彼水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一崔拥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凤覆,春花似錦握童、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稽揭。三九已至,卻和暖如春肥卡,著一層夾襖步出監(jiān)牢的瞬間溪掀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工步鉴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揪胃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓氛琢,卻偏偏與公主長得像喊递,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子阳似,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理骚勘,服務(wù)發(fā)現(xiàn),斷路器撮奏,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法俏讹,類相關(guān)的語法,內(nèi)部類的語法畜吊,繼承相關(guān)的語法泽疆,異常的語法,線程的語...
    子非魚_t_閱讀 31,630評論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評論 1 51
  • 從三月份找實(shí)習(xí)到現(xiàn)在玲献,面了一些公司殉疼,掛了不少,但最終還是拿到小米捌年、百度瓢娜、阿里、京東延窜、新浪、CVTE抹锄、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評論 11 349
  • 值班第二天回來的路上逆瑞,就有種葛優(yōu)躺的沖動,然后刷個(gè)最近熱映的劇伙单,《那年花開正月圓》再美美的睡個(gè)覺获高,畫面感想想就美。...
    與姝會友閱讀 394評論 0 0