关于LongAdder产生数据误差的疑惑
来源:3-1 线程安全性-原子性-atomic-1
weixin_慕数据7074580
2020-11-05
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;
}
这是atomic包下的LongAdder的sum()方法。LongAdder出现数据误差,是因为在统计时有数据更新;
问题:cells、base、value不是都是由volatile修饰的吗?不可以立刻观察到更新的数据吗?
写回答
1回答
-
Jimin
2020-11-06
你好,volatile只保证了可见性,并发写的时候依旧是有问题的,因此单靠volatile是无法保证线程安全的。关于longaddr可以看下这边文章:https://mp.weixin.qq.com/s/QKRnmX1Fq2HjhahNNX5M4Q
00
相似问题