2012-09-13 179 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來說是個好問題。