Question

je besoin d'un HashMap qui est accessible à partir de plusieurs threads.

Il y a deux options simples, en utilisant un HashMap normal et la synchronisation sur elle ou en utilisant un ConcurrentHashMap.

Depuis ConcurrentHashMap ne bloque pas sur les opérations de lecture, il semble beaucoup mieux adapté à mes besoins (presque exclusivement lit, presque jamais mises à jour). D'autre part, je pense très bas de toute façon la concurrence, donc il ne devrait pas bloquer (juste le coût de la gestion de la serrure).

La carte sera également très faible (moins de dix entrées), si cela fait une différence.

Par rapport à une HashMap régulière, combien plus coûteux sont les opérations de lecture et d'écriture (je suppose qu'ils sont)? Ou est-ConcurrentHashMap juste toujours mieux quand il pourrait y avoir même un niveau modéré d'accès simultané, quel que soit le rapport de lecture / mise à jour et la taille?

Était-ce utile?

La solution

  

D'autre part, je me attends très faible de toute façon la concurrence, donc il devrait y avoir aucun blocage (juste le coût de la gestion de la serrure).

Le coût d'acquisition et la libération d'un uncontend Java mutex (verrouillage primitive) est minuscule. Donc, si vous croyez que la probabilité de discorde est très faible alors simple HashMap est probablement votre meilleur pari.

Mais tout cela est conjecture. À moins que et jusqu'à ce que vous avez fait votre demande profilée, tout le temps consacré à l'optimisation spéculative est plus probable (*) le temps perdu.

* ... sauf si vous avez un vraiment une bonne intuition.

Autres conseils

CHM paie une pénalité pour l'utilisation des opérations atomiques * sous les couvertures, par rapport à HashMap. Combien? Devinez quoi ... la mesure dans votre application ...; -)

Si vous trouvez que vous avez réellement un problème de performance, il y a probablement une solution très spécialisée pour <10 entrées qui serait moins cher que toute solution assemblé sur des terres java.util, mais je ne serais pas sauter à ce que vous savez que vous avez un problème de performance.

En termes de débit et les performances, les frais généraux est généralement négligeable.

Sur une note différente, l'empreinte mémoire d'un ConcurrentHashMap (au niveau de l'instance) est un peu plus grand qu'un HashMap. Si vous avez un grand nombre de CHM de petite taille, cette surcharge peut ajouter.

La question principale w / CHM:. N'échelle pas bien sauf si vous modifiez l'appel c-tor, mais la plupart du temps, il ne se classe pas automatiquement les noyaux disponibles

3 liens ci-dessous sans lock-hashmap
http://www.azulsystems.com/blog / falaise cliquez / 2007-03-26-non bloquante-Hashtable
http: //www.azulsystems .com / blog / falaise cliquez / 2007-04-01-non-bloquant-Hashtable-partie-2
http://sourceforge.net/projects/high-scale-lib/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top