我正在尝试理解 ConcurrentHashMap 的迭代器代码,并且基于查看代码,它似乎有可能ConcurrentHashMap#values()#iterator
返回空值。
我相信这可能会发生,因为即使您不能添加空值,对 remove 的调用也会首先将值标记为空。
这是真的还是迭代器有办法处理这个?
我正在尝试理解 ConcurrentHashMap 的迭代器代码,并且基于查看代码,它似乎有可能ConcurrentHashMap#values()#iterator
返回空值。
我相信这可能会发生,因为即使您不能添加空值,对 remove 的调用也会首先将值标记为空。
这是真的还是迭代器有办法处理这个?
看看是如何get()
实现的,似乎 ConcuurrentHashMap 被编码以允许条目值是null
由于类初始化竞争(然后通过调用来处理)Segment.readValueUnderLock()
。看起来值迭代器从未检查过值的条目null
,因此您似乎有一个有效的问题(我不知道在迭代期间是否发生了一些其他易失性操作,这会改变这种可能性)。
但是,该方法有此 javadoc 注释Segment.readValueUnderLock()
:
读取处于锁定状态的条目的值字段。如果值字段似乎为空,则调用。这只有在编译器碰巧使用其表分配重新排序 HashEntry 初始化时才有可能,这在内存模型下是合法的, 但不知道是否会发生。
(最后强调我的)。
对 Doug Lea 来说,这可能是一个很好的问题。