ConcurrentHashMap (CHM pour faire court) a été nouvellement introduit dans Java 1.5 comme alternative à Hashable et est un membre important du package simultané. Avant Java 1.5, si vous souhaitez implémenter une carte qui peut être utilisée en toute sécurité dans des programmes multi-thread et simultanés, vous ne pouvez choisir que parmi les cartes hashtables et synchronisées, car le hashmap n'est pas en file d'attente. Mais après avoir introduit le CHM, nous avons un meilleur choix. Le CHM est non seulement une filetage, mais fonctionne également mieux que le hashtable et SynchronizedMap. Par rapport à HashTable et SynchronizedMap, la carte entière est verrouillée et CHM verrouille uniquement certaines cartes. Le CHM permet des opérations de lecture simultanées tout en maintenant l'intégrité des données lors des opérations d'écriture via des verrous synchrones. Nous avons appris les bases du CHM dans le top 5 des collections concurrentes Java de JDK 5 et 6. Dans ce blog, je présenterai les points suivants:
Mise en œuvre de concurrenthashmap en Java
CHM introduit la segmentation et fournit toutes les fonctionnalités prises en charge par HashTable. Dans CHM, le multithreading est pris en charge pour lire la carte et ne nécessite aucun blocage. Cela est dû au fait que CHM divise la carte en différentes parties, en verrouillant une partie de celui-ci lors de l'exécution de l'opération de mise à jour. Selon le niveau de concurrence par défaut, la carte est divisée en 16 parties et est contrôlée par différentes serrures. Cela signifie que jusqu'à 16 threads d'écriture peuvent faire fonctionner la carte en même temps. Imaginez simplement que d'un seul thread entrant à 16 threads d'écriture entrant en même temps (les threads de lecture sont presque illimités), l'amélioration des performances est évidente. Cependant, comme certaines opérations de mise à jour, telles que put (), retire (), putall () et clear (), ne verrouiller que l'opération, l'opération de recherche ne peut garantir que les derniers résultats seront renvoyés.
Un autre point important est que lors de l'itération du CHM, l'itérateur renvoyé par Keyset est faiblement cohérent et sécurisé et peut ne pas renvoyer certains changements récents. Pendant la traversée, si le contenu sur le tableau qui a été traversé change, l'observation de laModification Exceptoin ne sera pas jetée.
Le niveau de concurrence par défaut de CHM est de 16, mais il peut être modifié par un constructeur lors de la création de CHM. Il ne fait aucun doute que le niveau de concurrence représente le nombre d'opérations de mise à jour simultanées, donc si seulement quelques threads mettaient à jour la carte, il est recommandé de définir un faible niveau de concurrence. De plus, CHM utilise également ReentrantLock pour verrouiller les segments.
Exemple de méthode de putifabsente concurrentHashmap en Java
Plusieurs fois, nous voulons insérer des éléments lorsqu'ils n'existent pas, et nous écrivons généralement du code comme celui qui suit
synchronisé (map) {if (map.get (key) == null) {return map.put (key, value); } else {return map.get (key); }}Le code ci-dessus est facile à utiliser dans le hashmap et le hashtable, mais il existe un risque d'erreurs en CHM. En effet, CHM ne verrouille pas toute la carte pendant l'opération de put, donc lorsqu'un thread est mis (k, v), un autre fil de thread obtient (k) et deviendra nul, ce qui entraînera une valeur de file d'attente sur la valeur d'un autre thread. Bien sûr, vous pouvez encapsuler le code dans un bloc de code synchronisé, qui rendra votre code unique, bien que file. La méthode putifabsen (clé, valeur) fournie par CHM met en œuvre la même fonction atomiquement, tout en évitant le risque de compétition de threads ci-dessus.
Quand utiliser concurrenthashmap
Le CHM convient au moment où le nombre de lecteurs dépasse le nombre de lecteurs, et lorsque le nombre de lecteurs est supérieur ou égal au lecteur, les performances de CHM sont inférieures à celles de la carte de hachage et synchronisée. En effet, lorsque la carte entière est verrouillée, l'opération de lecture attend le fil qui effectue l'opération d'écriture dans la même pièce pour se terminer. Le CHM convient à la fabrication de cache, initialisé au début du programme, puis peut être accessible par plusieurs threads de demande. Comme l'explique Javadoc, le CHM est une bonne alternative au hashtable, mais n'oubliez pas que le CHM a légèrement moins de synchronisation que le hashtable.
Résumer
Maintenant, nous savons ce qu'est concurrenthashmap et quand utiliser concurrenthashmap. Passons en revue quelques points clés du CHM.
Ce qui précède est les scénarios d'implémentation et d'utilisation de CHM en Java, j'espère que cela pourra aider tout le monde! Merci pour votre soutien à ce site!