Il arrive qu'une carte soit construite et qu'une fois initialisée, elle ne soit plus jamais modifiée. Elle sera cependant accessible (via get(key) uniquement) à partir de plusieurs threads. Est-il sûr d'utiliser un java.util.HashMap
de cette manière ?
(Actuellement, j'utilise volontiers un java.util.concurrent.ConcurrentHashMap
Je n'ai pas de besoin mesuré d'améliorer la performance, mais je suis simplement curieux de savoir si un simple HashMap
suffirait. Cette question est donc pas "Il ne s'agit pas non plus d'une question de performance. La question est plutôt : "Est-ce que ce serait sûr ?")
4 votes
De nombreuses réponses sont correctes en ce qui concerne l'exclusion mutuelle des threads en cours d'exécution, mais incorrectes en ce qui concerne les mises à jour de la mémoire. J'ai voté en conséquence, mais il y a encore beaucoup de réponses incorrectes avec des votes positifs.
0 votes
@Heath Borders, si l'instance a était une HashMap non modifiable initialisée statiquement, elle devrait être sûre pour une lecture concurrente (puisque les autres threads n'auraient pas pu manquer les mises à jour puisqu'il n'y avait pas de mises à jour), n'est-ce pas ?
0 votes
S'il est initialisé de manière statique et n'est jamais modifié en dehors du bloc statique, alors cela peut être correct car toute l'initialisation statique est synchronisée par la fonction
ClassLoader
. Cela mérite une question à part entière. Je continuerais à le synchroniser explicitement et à le profiler pour vérifier qu'il cause de réels problèmes de performance.0 votes
@HeathBorders - Qu'entendez-vous par "mises à jour de la mémoire" ? La JVM est un modèle formel qui définit des choses comme la visibilité, l'atomicité, se produit avant mais n'utilise pas de termes tels que "mises à jour de la mémoire". Vous devriez clarifier ce point, de préférence en utilisant la terminologie du JLS.
2 votes
@Dave - Je suppose que vous n'êtes pas encore à la recherche d'une réponse après 8 ans, mais pour mémoire, la principale confusion dans presque toutes les réponses est qu'elles se concentrent sur les actions que vous effectuez sur l'objet carte . Vous avez déjà expliqué que vous ne modifiez jamais l'objet, donc tout cela n'est pas pertinent. Le seul problème potentiel est donc le suivant la manière dont vous publiez la référence à la
Map
que vous n'avez pas expliquée. Si vous ne le faites pas en toute sécurité, ce n'est pas sûr. Si vous le faites en toute sécurité, il est . Détails dans ma réponse.