LongAdder为什么可能会不准确?
1 个回答
我疯狂地奔跑,只想为你承担一切的伤害,我竖起了山丘,不愿你看见我丑陋的脸庞。叶无双**`LongAdder` 可能不准确的原因**主要与其设计和实现方式有关。在并发场景下,`LongAdder` 的 `sum` 方法返回的值并不是一个严格意义上的原子快照。 ### **不准确的原因** 1. **`sum` 方法不是原子操作**: - `LongAdder` 的计数值分散存储在 `base` 和多个 `Cell` 中,`sum` 方法通过遍历所有 `Cell` 并累加 `base` 来计算总和。 - 如果在遍历和累加的过程中,有其他线程对 `base` 或某个 `Cell` 的值进行了更新,这些更新可能不会被反映在当前计算结果中。 2. **并发更新时的竞态条件**: - 在调用 `sum` 方法的同时,其他线程可能正在对 `base` 或某个 `Cell` 进行更新。 - 由于没有对整个 `sum` 过程加锁,无法确保统计期间数据不会发生变化。 3. **JDK 源码说明**: JDK 的文档中明确指出: > The returned value is **NOT an atomic snapshot**; invocation in the absence of concurrent updates returns an accurate result, but concurrent updates that occur while the sum is being calculated might not be incorporated. 这说明在没有并发更新时,`sum` 方法可以返回准确结果,但在高并发更新的情况下,结果可能存在偏差。 ### **适用场景的权衡** - `LongAdder` 的设计目标是通过分散竞争来提高性能,因此它在高并发场景下更高效。 - 对于一些需要统计计数但不需要绝对精确结果的场景(如页面访问量、点赞数),这种“不准确性”通常是可以接受的。 ### **总结** `LongAdder` 的不准确性源于 `sum` 方法在计算总和时未对数据加锁,导致可能遗漏并发更新的部分结果。这种设计是为了在高并发场景下提高性能,而不是为了提供严格意义上的精确计数。发布于 2025-01-21 17:33 •IP属地 甘肃举报评论收藏
公众号进入网站体验更佳

