3 votes

Je ne comprends pas la différence entre le comportement de ConcurrentHashMap et de HashMap dans cet exemple.

J'essaie de comprendre comment fonctionne ConcurrentHashMap. J'ai trouvé un exemple, mais je n'arrive pas à le comprendre. Voici son code :

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) {
    myData.remove(key);
}

Cela entraînera une exception ConcurrentModificationException au moment de l'exécution.

Cependant, ce code utilisant ConcurrentHashMap fonctionnera correctement :

Map<String, Object> myData = new ConcurrentHashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) }
    myData.remove(key);
}

Quelqu'un peut-il m'expliquer pourquoi ConcurrentHashMap permet de supprimer des clés alors que le HashMap lève une exception ? Merci

6voto

Matt Timmermans Points 3405

C'est l'une des caractéristiques de ConcurrentHashMap . Pour citer les docs :

De même, les Iterators, Spliterators et Enumerations renvoient des éléments reflétant l'état de la table de hachage à un moment donné lors ou depuis la création de l'itérateur/de l'énumération. Ils ne lèvent pas ConcurrentModificationException.

ConcurrentHashMap ne fait pas vraiment cela pour soutenir votre cas d'utilisation, cependant. C'est fait pour permettre à l'itération dans un thread de se produire en même temps que les modifications faites dans d'autres threads.

Si c'est la seule raison pour laquelle vous utilisez ConcurrentHashMap alors vous devriez probablement reconsidérer votre décision, parce qu'il est beaucoup plus cher que le HashMap . Il est préférable de faire une copie du jeu de clés avant de l'utiliser de cette manière :

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for(String key: myData.keySet().toArray(new String[0]))
    myData.remove(key);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X