Est-il sûr d'obtenir les valeurs de java.util.Table de hachage à partir de plusieurs threads (pas de modification)?

Il y a un cas où une carte sera construit, et une fois qu'il est initialisé, il ne sera jamais à nouveau modifié. Il sera toutefois accessible (via get(clé) uniquement) à partir de plusieurs threads. Est-il sécuritaire d'utiliser un java.util.HashMap de cette façon?

(Actuellement, je suis heureux à l'aide d'un java.util.concurrent.ConcurrentHashMap, et n'ont pas mesuré la nécessité d'améliorer la performance, mais je suis simplement curieux de savoir si un simple HashMap suffirait. Par conséquent, cette question est pas "Qui dois-je utiliser?" elle n'est pas une question de la performance. La question est plutôt "Serait-il en sécurité?")

  • Beaucoup de réponses ici sont correctes au sujet de l'exclusion mutuelle de threads en cours d'exécution, mais incorrectes concernant la mémoire des mises à jour. J'ai voté en haut/en bas en conséquence, mais il ya encore beaucoup de réponses incorrectes avec des votes positifs.
  • Les frontières, si l'instance a été initialisé de manière statique inmodifiable table de hachage, il devrait être à l'abri des troubles de la lecture (comme les autres threads ne pouvais pas manquer les mises à jour car il n'y avait pas de mises à jour), droit?
  • Si c'est de manière statique initialisé et jamais modifiée en dehors de la statique bloc, alors il pourrait être ok parce que tous initialisation statique est synchronisé par l' ClassLoader. Que vaut une question distincte sur son propre. J'avais toujours explicitement de le synchroniser et de profil pour vérifier qu'il était la cause réelle des problèmes de performances.
  • qu'entendez-vous par "la mémoire des mises à jour"? La JVM est un modèle formel qui définit des choses comme la visibilité, l'atomicité, passe-avant le les relations, mais ne pas utiliser des termes comme "la mémoire des mises à jour". Vous devez préciser, de préférence en utilisant la terminologie du JLS.
  • Je suppose que vous n'êtes pas encore à la recherche de la réponse après 8 ans, mais pour l'enregistrement, la clé de la confusion dans presque toutes les réponses, c'est qu'ils l'accent sur les mesures que vous prenez sur le plan de l'objet. Vous ai déjà expliqué que vous ne modifiez jamais l'objet, donc, c'est tout hors de propos. La seule "gotcha", puis est comment vous publier la référence pour la Map, que vous n'avez pas à l'expliquer. Si vous n'avez pas le faire en toute sécurité, il n'est pas sûr. Si vous le faites en toute sécurité, il est. Les détails dans ma réponse.
InformationsquelleAutor Dave L. | 2008-09-19