web-dev-qa-db-fra.com

Carte de hachage sans fil?

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


  1. Si l'utilisateur essaie de mettre à jour la MAP et simultanément la MAP est mise à jour au niveau du backend -> Problème d'opération d'écriture simultanée.
  2. Si use essaie de lire quelque chose à partir de MAP et simultanément MAP est mis à jour au niveau du backend -> problème d'opération de lecture et d'écriture simultanée.

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>.

40
user381878

Vous êtes sur la bonne voie en utilisant ConcurrentHashMap . Pour chaque point:

  1. Découvrez les méthodes 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.
  2. La méthode get n'est pas synchronisée en interne mais renverra la valeur la plus récente pour la clé spécifiée à sa disposition (consultez la Javadoc de classe ConcurrentHashMap pour discussion ).

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).

53
krock

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.)

8
miedwar