Я пытаюсь понять, как работает отказоустойчивый итератор. Я столкнулся с чем-то странным в параллельном хэшмапе. Код выглядит следующим образом -ConcurrentHashMap возвращает null, если я удаляю следующий объект
ConcurrentHashMap<String,String> hm = new ConcurrentHashMap<String,String>();
hm.put("name1", "value1");
hm.put("name2", "value2");
hm.put("name3", "value3");
Iterator<String> itr = hm.keySet().iterator();
int index = 0;
while(itr.hasNext()) {
System.out.println(hm.get(itr.next()));
hm.put(index+"1", index+"2");
hm.remove("name2");
index++;
}
System.out.println("--- Second iteration --- ");
Iterator<String> itr2 = hm.keySet().iterator();
while(itr2.hasNext()) {
System.out.println(hm.get(itr2.next()));
}
который печатает:
value3
null
value1
--- Second iteration ---
12
02
value3
value1
22
Я смущен, почему удаление элемента в первом случае был обновлен в то время как добавление нет! Я использую среду выполнения 1.8.
Нет гарантии, что вы будете или не увидите изменений, которые вы выполняете в процессе Итерации. Видите ли вы, это будет зависеть от того, как далеко вы прошли и где ключ будет помещен во внутреннюю структуру данных. –