Я поиграл с java.util.HashMap
, чтобы узнать, что такое поведение fail-fast
.
HashMap map = new HashMap();
map.put("jon", 10);
map.put("sean", 11);
map.put("jim", 12);
map.put("stark", 13);
map.put("vic", 14);
Set keys = map.keySet();
for(Object k:keys) {
System.out.println(map.get(k));
}
for(Object k:keys) {
String key =(String)k;
if(key.equals("stark")) {
map.remove(key);
}
}
System.out.println("after modifn");
for(Object k:keys) {
System.out.println(map.get(k));
}
я получил результат
12
11
10
14
13
after modifn
12
11
10
14
Я также пытался использовать итератор
Iterator<String> itr = keys.iterator();
while(itr.hasNext()) {
String key = itr.next();
if(key.equals("stark")) {
map.remove(key);
}
}
В любом случае я не получил ConcurrentModificationException
. Это потому, что (из javadoc)
безотказное поведение итератора не может быть гарантировано, поскольку, вообще говоря, невозможно дать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Отказоустойчивые итераторы выбрасывают ConcurrentModificationException в максимально возможной степени.
Я проверил другую поток, в котором говорится, что он БУДЕТ выкинуть ConcurrentModificationException
.. что вы думаете?
clear()
, а неremove()
. - person Bringer128   schedule 19.06.2012