jdk1.7中ConCurrentHashMap的size方法如何保证正确

发布于 2022-09-12 01:14:16 字数 159 浏览 27 评论 0

我看论坛上都说是计算两次modCount,如何两次相同就认为没有改变。如果两次不同就加锁再计算一遍。

我的问题是为什么前两次一样就能认为没有改变?
例如,在计算第二次的时候,计算玩一个segment的modCount之后,这个segment有新增了一个。那计算的结果不就是错的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞笑我太脆弱 2022-09-19 01:14:16

涉及到 modCount 改变的地方只有 put / remove 这些方法里,这些方法里全都有锁,并且需要注意的是,是 先执行的 modCount++、再执行的相应的增加或移除元素的操作

也就是你说的“这个 segment 又新增了一个”的时候,modCount 已经变化了,不会存在你说的问题。

如果 modCount 结果已经计算出了、“这个 segment 又新增了一个”,说明从执行顺序上,size 方法也是先执行的,它计算的是当时的容器大小。难道你想让 size 能预知下一刻的大小?

更何况高并发情况下要想取得精确值,你本身就应该加锁操作。

流星番茄 2022-09-19 01:14:16

jdk7和jdk8实现方法不一样。

jdk8 是通过对 baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出size,后者内部有volatile变量保证可见性。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文