知识卡片

LongAdder分散热点

普通读书笔记卡 · 1515

内容

AtomicLong 所有线程都对同一个 value 字段做 CAS,竞争越激烈重试越多;LongAdder 用空间换时间把热点拆散:无竞争只操作 base 值,出现 CAS 失败才初始化 cells 数组,线程按哈希映射到不同 Cell 各自累加,读总值才遍历求和。代价是求和只是近似值,适合统计计数,不适合余额、库存等强一致场景。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第3章《CAS原理与JUC原子类》3.5.1节《以空间换时间:LongAdder》、3.5.2节《LongAdder的原理》(源文件:_epub-src/OEBPS/Text/chapter116.xhtml、chapter117.xhtml) - 结论依据:原文指出LongAdder“核心思想是热点分离……将value值分离成一个数组,当多线程访问时,通过Hash算法将线程映射到数组的一个元素进行操作;而获取最终的value结果时,则将数组的元素求和”,并给出base+cells两级结构与sum()累加实现,在CAS争用激烈场景下性能是AtomicLong的8倍,因此推出本卡结论。 - 原始内容:LongAdder的基本思路是分散热点,将value值分散到一个数组中,不同线程会命中到数组的不同槽(元素)中,各个线程只对自己槽中的那个值进行CAS操作。这样热点就被分散了,冲突的概率就小很多……在CAS争用最为激烈的场景下,LongAdder的性能是AtomicLong的8倍。