簡體   English   中英

ConcurrentHashMap的迭代器給出奇怪的結果

[英]Iterator for ConcurrentHashMap giving strange result

ConcurrentHashMap是線程安全的。 因此,如果在迭代時添加任何要映射的值,則不應考慮它們。 下面是我的代碼:

public class Test {
public static void main(String[] args) {
    ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
    map.put("ONE", 1);
    map.put("TWO", 2);
    Iterator<String> it = map.keySet().iterator();
    while (it.hasNext()) {
        String key = (String) it.next();
        System.out.println(key + " : " + map.get(key));
        map.put("9", 10); // This should not be reflected in the Iterator
        map.put("5", 10); // This should not be reflected in the Iterator
    }
}
}

輸出:

    TWO : 2
    ONE : 1
    9 : 10

我的問題是為什么迭代器考慮map.put(“ 9”,10);?

ConcurrentHashMap是線程安全的。 因此,如果在迭代時添加任何要映射的值,則不應考慮它們。

那是不對的。 這是javadoc所說的:

“類似地,迭代器,拆分器和枚舉返回在創建迭代器/枚舉時或此后某個時刻反映哈希表狀態的元素。”

注意“或自”!

它還表示迭代器“弱一致性”,這意味着:

“保證它們會遍歷在構造時已經存在的元素一次,並且可能(但不保證)反映出構造后的任何修改。”


簡而言之,您期望的是Javadocs顯然沒有的迭代器的屬性。

ConcurrentHashMap是線程安全的 ,但這是另一種情況。

一個列表,你可以使用帶有ListIterator.Add這是專為的ListIterator。

使用HashMap,我看到兩個解決方案:

  1. 轉換為列表,然后返回到HashMap

  2. 循環結束后,對新元素使用附加的HashMap,然后使用另一個循環添加所有新元素(雖然不太優雅,但是可以!)。

對於Java 8,您可以考慮使用lambda-expressions來簡化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM