关于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

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程