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