JDK8中新增原子性操作類LongAdder,LongAdder類是LongAccumulator的一個(gè)特例,LongAccumulator提供了比LongAdder更強(qiáng)大的功能,只需要構(gòu)造LongAccumulator時(shí)候傳入自定義雙面運(yùn)算器就OK,后者則內(nèi)置累加的規(guī)則。

前言
本文主要給大家介紹了關(guān)于JDK8新增的原子性操作類LongAdder的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹:
LongAdder簡(jiǎn)單介紹
LongAdder類似于AtomicLong是原子性遞增或者遞減類,AtomicLong已經(jīng)通過(guò)CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器來(lái)說(shuō)性能已經(jīng)很好了,但是JDK開發(fā)組并不滿足,因?yàn)樵诜浅8叩牟l(fā)請(qǐng)求下AtomicLong的性能不能讓他們接受,雖然AtomicLong使用CAS但是CAS失敗后還是通過(guò)無(wú)限循環(huán)的自旋鎖不斷嘗試的

在高并發(fā)下N多線程同時(shí)去操作一個(gè)變量會(huì)造成大量線程CAS失敗然后處于自旋狀態(tài),這大大浪費(fèi)了cpu資源,降低了并發(fā)性。那么既然AtomicLong性能由于過(guò)多線程同時(shí)去競(jìng)爭(zhēng)一個(gè)變量的更新而降低的,那么如果把一個(gè)變量分解為多個(gè)變量,讓同樣多的線程去競(jìng)爭(zhēng)多個(gè)資源那么性能問(wèn)題不就解決了?是的,JDK8提供的LongAdder就是這個(gè)思路。下面通過(guò)圖形來(lái)標(biāo)示兩者不同。

如圖AtomicLong是多個(gè)線程同時(shí)競(jìng)爭(zhēng)同一個(gè)變量。

如圖LongAdder則是內(nèi)部維護(hù)多個(gè)變量,每個(gè)變量初始化都0,在同等并發(fā)量的情況下,爭(zhēng)奪單個(gè)變量的線程量會(huì)減少這是變相的減少了爭(zhēng)奪共享資源的并發(fā)量,另外多個(gè)線程在爭(zhēng)奪同一個(gè)原子變量時(shí)候如果失敗并不是自旋CAS重試,而是嘗試獲取其他原子變量的鎖,最后獲取當(dāng)前值時(shí)候是把所有變量的值累加后返回的。
LongAdder維護(hù)了一個(gè)延遲初始化的原子性更新數(shù)組和一個(gè)基值變量base.數(shù)組的大小保持是2的N次方大小,數(shù)組表的下標(biāo)使用每個(gè)線程的hashcode值的掩碼表示,數(shù)組里面的變量實(shí)體是Cell類型,Cell類型是AtomicLong的一個(gè)改進(jìn),用來(lái)減少緩存的爭(zhēng)用,對(duì)于大多數(shù)原子操作字節(jié)填充是浪費(fèi)的,因?yàn)樵有圆僮鞫际菬o(wú)規(guī)律的分散在內(nèi)存中進(jìn)行的,多個(gè)原子性操作彼此之間是沒有接觸的,但是原子性數(shù)組元素彼此相鄰存放將能經(jīng)常共享緩存行,所以這在性能上是一個(gè)提升。
另外由于Cells占用內(nèi)存是相對(duì)比較大的,所以一開始并不創(chuàng)建,而是在需要時(shí)候在創(chuàng)建,也就是惰性加載,當(dāng)一開始沒有空間時(shí)候,所有的更新都是操作base變量,
自旋鎖cellsBusy用來(lái)初始化和擴(kuò)容數(shù)組表使用,這里沒有必要用阻塞鎖,當(dāng)一次線程發(fā)現(xiàn)當(dāng)前下標(biāo)的元素獲取鎖失敗后,會(huì)嘗試獲取其他下表的元素的鎖。更詳細(xì)的說(shuō)明敬請(qǐng)期待 Java并發(fā)編程基礎(chǔ)之并發(fā)包源碼剖析 一書的出版
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版









Apifox(Api調(diào)試管理工具)2.1.29.1 綠色版
小烏龜代碼管理工具(TortoiseGit)2.13.0.1 中文免費(fèi)版
SoapUI破解版5.7.0 最新版
小皮面板(phpstudy)8.1.1.3 官方最新版
Ruby3.0(ruby運(yùn)行環(huán)境)3.0.2 官方版
gcc編譯器( MinGW-w64 9.0.0綠色版)免費(fèi)下載
寶玉編輯助手0.0.05新版
火花編程軟件2.7.2 官方pc版
猿編程少兒班客戶端3.1.1 官方版
Restorator 2009中文版單文件漢化版
十六進(jìn)制閱讀小工具
IT碼農(nóng)工具軟件1.0 中文免費(fèi)版
Postman Canary(網(wǎng)頁(yè)調(diào)試軟件)官方版7.32.0綠色免費(fèi)版
大耳猴少兒編程客戶端1.1.2 官方免費(fèi)版
excel批量sql語(yǔ)句(通過(guò)excel構(gòu)建sql工具)1.0 免費(fèi)版
軟件添加彈窗和網(wǎng)址工具1.0 中文免費(fèi)版
天霸編程助手2.1 單文件中文版
ida pro 中文破解版(反編譯工具)7.0 永樂漢化版64位
VBA代碼助手3.3.3.1官方版
JDK 12 linux版for 64位
Samba(完全支持Python 3)4.10 官方最新版
猿編程電腦端3.9.1.347 官方PC版
蒲公英 Android SDKV4.1.11 官方最新版
蒲公英iOS SDK2.8.9.1 官方最新版
WxPython中文可視化編輯器1.2 簡(jiǎn)體中文免費(fèi)版
Python代碼生成器1.0 中文免費(fèi)版
C語(yǔ)言代碼實(shí)例助手1.0 免費(fèi)版
notepad++7.8.2 中文免費(fèi)版
wpe pro Alpha 0.9a 中文綠色版




系統(tǒng)自帶的命令行幫助文件(ntcmds.chm)chm格
Excel轉(zhuǎn)換XML工具1.0 免費(fèi)版
實(shí)體類SQL生成工具1.0 綠色免費(fèi)版
XML字符串解析工具2.0.3 免費(fèi)版
VC++Spelly(代碼拼寫檢查)3.0.1 官方最新版
易語(yǔ)言vc6迷你連接器【dos命令形式運(yùn)行】綠
Elastix 20163.0 免費(fèi)版
sql語(yǔ)法分析器(sql語(yǔ)法分析工具)3.1.0 綠色
dev c++下載(DEV-C++)5.9.2 多語(yǔ)安裝免費(fèi)版
vc字體設(shè)置工具(vc6字體設(shè)置工具)1.0 中文綠