簡體   English   中英

遍歷ConcurrentHashMap后使用get()

[英]Using get() after iterating over ConcurrentHashMap

我有一個這樣的代碼片段:

    private final Map<String, Information> infoMap = new ConcurrentHashMap<String, Information>();

    synchronized (infoMap) {
        for (final String nameAndVersion : infoMap.keySet()) {
            final Information info = infoMap.get(nameAndVersion);
            final String name = info.getName();
            names.add(name);
        }
    }

我的問題是:是否需要使用如圖所示的同步塊,因為從keySet()到get()的操作不是原子的(因此,可以在一個調用與下一個調用之間更新映射,因為ConcurrentHashMap是每個調用僅具有線程安全性)?

我是否應該遍歷EntrySet以確保構造完整的迭代器?

我相信如果調用keySet()和get(),則需要同步塊,但是對此我不確定。

預先感謝您的回復。

這取決於您需要的結果。

當前,如果在另一個線程中修改了infoMap ,則在infoMap getinfo很可能為null ,這將導致對getName的調用中出現NPE 如果這是必需的行為,或者您確信此方法是將要修改Map的唯一位置,那么僅synchronized就足夠了。

使用EntrySet不會EntrySet問題-只會推遲它。 所有要做的就是確保,如果在迭代過程中刪除某個條目,則不會立即出現問題-但是顯然,您可能返回的映射圖中不再存在的數據。

遍歷HashMap的鍵和值時,應始終使用entrySet()方法。 此外,在ConcurrentHashMap中,entrySet()將永遠不會拋出“ ConcurrentModificationException” (請參閱Javadoc)

暫無
暫無

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

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