2012-09-13 99 views
3

我想了解迭代器代码ConcurrentHashMap和基于看代码,它似乎有可能为ConcurrentHashMap#values()#iterator返回空值。ConcurrentHashMap值迭代器可以返回null

我相信会发生这种情况,因为即使无法添加空值,删除的调用也会首先将值标记为空。

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

+1

你为什么不试试? – user1329572

+2

我在ConcurrentHashMap代码中看不到任何内容,它将现有条目的值设置为null(jdk 6&7)。你在哪里看到的? – jtahlborn

+0

[请参阅此处。](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html#remove(java.lang.Object))。它返回旧值,所以如果没有任何东西,它将返回null。 – Neil

回答

2

寻找如何get()实施,似乎ConcuurrentHashMap编码允许的情况下的入账价值是null由于类的初始化比赛(然后通过以Segment.readValueUnderLock()呼叫处理。看来该值迭代器以往检查null值项,因此它似乎你有一个有效的问题(我不知道是否有一些其他挥发性操作该迭代这将改变这种可能性期间会发生)。

然而,在Segment.readValueUnderLock()方法中有这个javadoc注释:

读取锁定条目的值字段。如果值 字段曾经显示为空,则被调用。只有在 编译器重新排序HashEntry初始化时才有可能, 其表格赋值在内存模型 下合法,但是不会发生。

(最后强调我的)。

可能对Doug Lea来说是个好问题。