3

我正在尝试理解 ConcurrentHashMap 的迭代器代码,并且基于查看代码,它似乎有可能ConcurrentHashMap#values()#iterator返回空值。

我相信这可能会发生,因为即使您不能添加空值,对 remove 的调用也会首先将值标记为空。

这是真的还是迭代器有办法处理这个?

4

1 回答 1

2

看看是如何get()实现的,似乎 ConcuurrentHashMap 被编码以允许条目值是null由于类初始化竞争(然后通过调用来处理)Segment.readValueUnderLock()。看起来值迭代器从未检查过值的条目null,因此您似乎有一个有效的问题(我不知道在迭代期间是否发生了一些其他易失性操作,这会改变这种可能性)。

但是,该方法有此 javadoc 注释Segment.readValueUnderLock()

读取处于锁定状态的条目的值字段。如果值字段似乎为空,则调用。这只有在编译器碰巧使用其表分配重新排序 HashEntry 初始化时才有可能,这在内存模型下是合法的, 但不知道是否会发生。

(最后强调我的)。

对 Doug Lea 来说,这可能是一个很好的问题。

于 2012-09-13T15:13:13.517 回答