[英]Ensure to get all values of `ConcurrentHashMap` when iterating over it while other threads put elements
[英]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
get
時info
很可能為null
,這將導致對getName
的調用中出現NPE
。 如果這是必需的行為,或者您確信此方法是將要修改Map
的唯一位置,那么僅synchronized
就足夠了。
使用EntrySet
不會EntrySet
問題-只會推遲它。 所有要做的就是確保,如果在迭代過程中刪除某個條目,則不會立即出現問題-但是顯然,您可能返回的映射圖中不再存在的數據。
遍歷HashMap的鍵和值時,應始終使用entrySet()方法。 此外,在ConcurrentHashMap中,entrySet()將永遠不會拋出“ ConcurrentModificationException” (請參閱Javadoc)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.