LongAdder
来源:3-1 线程安全性-原子性-atomic-1
![](http://img1.sycdn.imooc.com/user/55e57c0400014a4310241024-100-100.jpg)
红邮筒
2018-12-25
LongAdder会将数据分离成一个数组,每个线程访问时通过hash等算法映射到数组其中一个数字进行计数,计数的最终结果是这个数组的求和累加,这个过程具体是怎样的?数组里每个元素都是这个数据吗?如果有hash冲突怎么办?
2回答
-
Jimin
2018-12-28
// 返回累加的和,也就是“当前时刻”的计数值
// 此返回值可能不是绝对准确的,因为调用这个方法时还有其他线程可能正在进行计数累加,
// 方法的返回时刻和调用时刻不是同一个点,在有并发的情况下,这个值只是近似准确的计数值
// 高并发时,除非全局加锁,否则得不到程序运行中某个时刻绝对准确的值,但是全局加锁在高并发情况下是下下策
// 在很多的并发场景中,计数操作并不是核心,这种情况下允许计数器的值出现一点偏差,此时可以使用LongAdder
// 在必须依赖准确计数值的场景中,应该自己处理而不是使用通用的类
public long sum() {
Cell[] as = cells; Cell a;
long sum = base;
if (as != null) {
for (int i = 0; i < as.length; ++i) {
if ((a = as[i]) != null)
sum += a.value;
}
}
return sum;
}00 -
Jimin
2018-12-25
你好,这个问题更适合从源码上去分析,推荐一篇文章,对这个类的源码做了比较详细的讲解,https://blog.csdn.net/u011392897/article/details/60480108 ,你先看下,看看对源码的分析是否可以满足你的需求,如果哪里不懂,继续这里回复即可。
042018-12-28
相似问题