Ho giocato con java.util.HashMap
per scoprire il comportamento di fail-fast
.errore comportamento veloce di java HashMap
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));
}
ho ottenuto il risultato
12
11
10
14
13
after modifn
12
11
10
14
Ho anche provato ad utilizzare un iteratore
Iterator<String> itr = keys.iterator();
while(itr.hasNext()) {
String key = itr.next();
if(key.equals("stark")) {
map.remove(key);
}
}
non ho avuto alcun ConcurrentModificationException
in entrambi i casi ..è questo perché (da javadoc)
il comportamento fail-fast di un itera non può essere garantito così com'è, in generale, impossibile fornire garanzie rigide nella presenza dello di modifica simultanea non sincronizzata. Fail-fast iteratori gettano ConcurrentModificationException su base best-effort
ho controllato un altro thread che dice, si getterà ConcurrentModificationException
..che ne pensi?
Prova a chiamare 'clear()' piuttosto che 'remove()'. – Bringer128