Java — HashMap vs ConcurrentHashMap (Concurrence & performance)
Comprendre la différence entre HashMap et ConcurrentHashMap est essentiel dès qu’on travaille avec plusieurs threads. C’est un sujet très fréquent et directement lié aux performances et à la stabilité des applications.
Idée simple
HashMap
- ❌ pas thread-safe
- ✔️ très rapide en mono-thread
ConcurrentHashMap
- ✔️ thread-safe
- ✔️ optimisé pour la concurrence
Problème avec HashMap
Map<String, Integer> map = new HashMap<>();
En multithreading :
- données corrompues
- résultats imprévisibles
- dans certains cas extrêmes → boucle infinie
Solution : ConcurrentHashMap
Map<String, Integer> map = new ConcurrentHashMap<>();
Permet :
- accès concurrent sécurisé
- bonnes performances
- utilisation en environnement multi-thread
⚡ Différence clé
HashMap
- aucune synchronisation
- rapide
- dangereux en multi-thread
ConcurrentHashMap
- synchronisation fine (granulaire)
- pas de blocage global
- meilleure scalabilité
Pourquoi pas juste synchronized ?
Map<String, Integer> map = Collections.synchronizedMap(new HashMap<>());
Problème :
- verrou global (lock sur toute la map)
- forte contention
- performances réduites
ConcurrentHashMap est préférable car :
- verrouillage partiel (par zones internes)
- plusieurs threads peuvent travailler en parallèle
Résumé simple
| Feature | HashMap | ConcurrentHashMap |
|---|---|---|
| thread-safe | ❌ | ✔️ |
| performance | ✔️ | ✔️✔️ (multi-thread) |
| type de lock | ❌ | fin (granulaire) |
Pièges fréquents
- utiliser
HashMapen multithread - penser que
synchronizedMapest optimal - ignorer la contention
Questions classiques
Q1
HashMap est-il thread-safe ?
Non
Q2
ConcurrentHashMap utilise quel type de verrou ?
- A. lock global
- B. lock fin
- C. aucun lock
Réponse : B
Q3
Pourquoi éviter synchronizedMap ?
car il utilise un lock global, ce qui augmente la contention et réduit les performances
Q4
Quel choix pour une application multi-thread (ex: trading) ?
ConcurrentHashMap
À retenir
HashMapest rapide mais dangereux en multi-threadConcurrentHashMapest conçu pour la concurrence- il réduit la contention grâce à un verrouillage fin
- il permet de meilleures performances en parallèle
🧾 En résumé
HashMap→ simple, rapide, mais non sécuriséConcurrentHashMap→ sécurisé et performant en multi-threadsynchronizedMap→ fonctionne mais moins performant- en concurrence réelle → privilégier
ConcurrentHashMap
Le choix de la structure de données impacte directement la performance et la stabilité d’une application concurrente.