1. 程式人生 > >LongAdder和AtomicLong的區別(不看後悔,一看必懂)

LongAdder和AtomicLong的區別(不看後悔,一看必懂)

AtomicLong的原理是依靠底層的cas來保障原子性的更新資料,在要新增或者減少的時候,會使用自循(CLH)方式不斷地cas到特定的值,從而達到更新資料的目的。然而線上程競爭激烈的情況下,自循往往浪費很多計算資源才能達成預期效果。

 

面對自循的缺點,jdk1.8推出了LongAdder類,他的實現方式有點像ConcurrentHashMap一樣,採用空間換時間的方式,提高線上程競爭激烈的情況下,提供計數的效率,接下來我們看看原始碼是怎麼實現的。執行緒數越多,併發運算元越大,LongAdder的優勢逐漸體現出來

 

看原始碼前,我們先明白原始碼做了些什麼,這樣有目的的看,往往事半功倍。

 

LongAdder內裡面存在一個Cell陣列,計數是將執行緒id進行hash演算法後,得到一個小於等於當前計算機核數的值,根據該值定位到一個cell陣列,然後操作該cell進行單獨計數。最終求總計數值時候,把所有的cell陣列值相加即可。這樣將多個執行緒操作一個AtomicLong轉變為多個執行緒操作多個cell的情況,自然競爭小了,效率高了。可是儲存空間大了。