J'écris une application qui retournera un HashMap à l'utilisateur. L'utilisateur obtiendra une référence à cette carte. Sur le backend, je vais exécuter quelques threads qui mettront à jour la carte.
Ce que j'ai fait jusqu'à présent?
J'ai créé tous les threads backend, alors partagez un canal commun pour mettre à jour la MAP. Donc, au niveau du backend, je suis sûr que l'opération d'écriture simultanée ne sera pas un problème.
Problèmes que j'ai
Jusqu'à présent, je n'ai pas fait face à un tel problème, mais j'ai peur de pouvoir faire face à l'avenir. Veuillez donner des informations.
J'utilise ConcurrentHashMap<String, String>.
Vous êtes sur la bonne voie en utilisant ConcurrentHashMap
. Pour chaque point:
putIfAbsent
et replace
les deux sont threadsafe et combinent la vérification de l'état actuel de la table de hachage et sa mise à jour en une seule opération atomique.L'avantage de ConcurrentHashMap
sur quelque chose comme Collections.synchronizedMap
est les méthodes combinées comme putIfAbsent
qui fournissent la carte traditionnelle get
et put
logique d'une manière synchronisée en interne. Utilisez ces méthodes et n'essayez pas de fournir votre propre synchronisation personnalisée sur ConcurrentHashMap
car cela ne fonctionnera pas. Les collections Java.util.concurrent
Sont synchronisées en interne et les autres threads ne répondent pas aux tentatives de synchronisation de l'objet (par exemple synchronize(myConcurrentHashMap){}
ne bloquera pas les autres threads).
Note latérale:
Vous voudrez peut-être examiner l'implémentation de la table de hachage sans verrouillage par Cliff Click, elle fait partie de la bibliothèque Java hautement évolutif
(Voici un Google Talk par Cliff Cliquez sur ce hachage sans verrouillage.)