import java.util.HashMap;
import java.util.Map;
public class Example {
private final HashMap<String, String> map = new HashMap<String, String>();
public static void main(String[] args) {
new Example();
}
public Example() {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
int counter = 0;
while (true) {
Map<String, String> tmp = new HashMap<String, String>();
tmp.put("example" + counter, "example");
counter++;
map.putAll(tmp);
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
map.values().remove("example");
}
}
});
thread1.start();
thread2.start();
}
}
Malheureusement, je ne peux pas copier/coller le code de fonctionnement directement à partir de mon poste de travail actuel, donc je retapé ici donc il pourrait y avoir une erreur de frappe.
Comme vous pouvez le constater, le premier thread ajoute continuellement des valeurs tandis que le second thread itère sur les valeurs de la carte. Quand il commence à itérer sur les valeurs, il attend un certain nombre de valeurs (cette valeur est initialisée lors de la construction de l'itérateur). Cependant, étant donné que thread1 ajoute continuellement des éléments, cette valeur n'est pas celle attendue lorsque l'Iterator vérifie la quantité réelle de valeurs qui se trouvent dans la carte lorsqu'il exécute le code de suppression. Cela provoque l'exception ConcurrentModificationException.