à quoi sert la carte de hachage simultanée en java? quels en sont les avantages? Comment ça marche? aidez s'il vous plaît .. Un exemple de code sera également utile.
Réponses
Trop de publicités?Le point est de fournir une implémentation de la HashMap
qui est thread-safe. Plusieurs threads peuvent lire et écrire sans la possibilité de recevoir out-of-date de, ou des données corrompues. ConcurrentHashMap
fournit sa propre synchronisation, de sorte que vous n'avez pas à synchroniser les accès aux explicitement.
Une autre caractéristique de l' ConcurrentHashMap
, c'est qu'il fournit l' putIfAbsent
méthode, qui va automatiquement ajouter un mappage si la clé spécifiée n'existe pas. Considérons le code suivant:
ConcurrentHashMap<String, Integer> myMap = new ConcurrentHashMap<String, Integer>();
// some stuff
if (!myMap.contains("key")) {
myMap.put("key", 3);
}
Ce code n'est pas thread-safe, parce qu'un autre thread pourrait ajouter un mappage pour "key"
entre l'appel à l' contains
, et l'appel d' put
. La mise en œuvre correcte serait:
myMap.putIfAbsent("key", 3);
ConcurrentHashMap
permettre l'accès simultané à la carte. Les tables de hashage, offre un accès synchronisé à la carte, mais la totalité de votre carte est verrouillée à effectuer toute opération.
La logique derrière ConcurrentHashMap est qu' your entire table is not getting locked
, mais seulement la partie[segments
]. Chacun des segments gère son propre table de hachage. Le verrouillage est appliquée uniquement pour les mises à jour. Dans le cas de de récupérations, il permet de pleine concurrence.
Prenons quatre threads travaillent simultanément sur une carte dont la capacité est de 32, la table est divisée en quatre segments où chacun des segments gère une table de hachage de la capacité. La collection tient à jour une liste de 16 segments par défaut, chaque de ce qui est utilisé pour de la garde (ou de lock-on) un seul compartiment de la carte.
Cela signifie que les 16 threads peuvent modifier la collection à un moment unique. Cette simultanéité peut être augmenté à l'aide de l'option concurrencyLevel constructeur argument.
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel)
Comme l'autre réponse, a déclaré, le ConcurrentHashMap offre nouvelle méthode putIfAbsent()
qui est similaire à le mettre à l'exception de la valeur ne sera pas remplacé si la clé existe.
private static Map<String,String> aMap =new ConcurrentHashMap<String,String>();
if(!aMap.contains("key"))
aMap.put("key","value");
La nouvelle méthode est également plus rapide car il évite double traversing
comme ci-dessus. contains
méthode a pour localiser le segment et parcourir le tableau pour trouver la clé et de nouveau la méthode put
est de parcourir le seau et de mettre sur la touche.
Vraiment la grande différence de fonctionnement est qu'il ne lance pas d'exception et/ou endommagé lorsque quelqu'un d'autre change pendant que vous l'utilisez.
Avec des collections régulières, si un autre thread ajoute ou supprime un élément alors que vous êtes d'accès (via l'itérateur) lèvera une exception. ConcurrentHashMap leur permet de faire le changement et n'arrêtez pas votre fil.
Rappelez-vous qu'il n'a pas à faire toute sorte de synchronisation des garanties ou des promesses sur le point-à-temps, la visibilité de la modification d'un thread à l'autre. (C'est un peu comme une lecture engagée base de données de l'isolement, plutôt que d'un synchronisé carte qui se comporte plus comme un serializable base de données de l'isolement. (ancienne école de verrouillage de ligne de SQL serializable, pas Oracle-ish multiversion serializable :) )
L'utilisation la plus commune que je connaisse est dans le cache immuable informations issues de données dans le Serveur d'Application des environnements où de nombreux threads peuvent accéder à la même chose, et il n'a pas vraiment d'importance si les deux arrivent à calculer la même valeur du cache et de le mettre deux fois parce qu'ils interleave, etc. (par exemple, il est largement utilisé à l'intérieur du Printemps WebMVC cadre pour la tenue d'exécution dérivé de config comme les mappages d'Url pour les Méthodes de Gestionnaire d'.)