2017-07-18 6 views
1

Je suis en train d'écrire une classe dans laquelle un ConcurrentHashMap statique est utilisé (avec des opérations telles que get(), put(), clear(), etc.) par plusieurs threads. Dans cette classe, j'ai également besoin de sérialiser le ConcurrentHashMap dans un fichier et de le désérialiser à partir du fichier. Le problème est que le ConcurrentHashMap peut être modifié pendant qu'il est sérialisé et, par conséquent, il peut ne pas être thread-safe.Une bonne façon de sérialisation ConcurrentHashMap dans un environnement multithread

Mes questions sont les suivantes:

  1. ConcurrentHashMap est thread-safe, est-il sûr qu'il est modifié pendant qu'il est sérialisé par plusieurs threads? (Je suppose que la réponse est non, mais besoin de confirmation)
  2. Quelle est la meilleure pratique pour sérialiser ConcurrentHashMap dans plusieurs threads avec le risque d'une modification en même temps. Notez que la sécurité et la performance sont critiques pour mon application.

Répondre

0

Vous commencez par regarder dans le Javadoc:

Une table de hachage complète de soutien concurrency et récupérations exécutées simultanément prévu pour les mises à jour.

En ce sens, la réponse est: il dépend.

Comme indiqué ci-dessus: il est possible de lire une telle carte tandis que il est en cours de mise à jour. Donc en théorie, vous pouvez "sérialiser" votre carte en lisant simplement tous ses; et stocker ceux-ci. Mais bien sûr, vous n'avez aucune idée si les mises à jour ont eu lieu en lisant la carte. Donc - pas une bonne idée. Puis considérons la sérialisation de la carte entière en un. Cela dépendra peut-être exactement de la façon dont vous faites cela (comme: utiliser la sérialisation des anciens objets java - ou peut-être des bibliothèques comme jackson ou gson pour sérialiser la carte en JSON) - mais d'un autre côté, la sérialisation devra regarder le internes de l'objet cartographique. Et vous faites pas voulez que la carte soit mise à jour pendant que cela se passe.

Conclusion: le seul choix pour vous est d'utiliser un verrou que tout thread qui va mettre à jour ou sérialiser la carte doit tenir.

Voir here pour une introduction aux différents types de serrures.

Et vous savez, vous ne pouvez pas l'avoir dans les deux sens. Si l'intégrité de vos données vous intéresse, alors vous devez bloquer toutes les requêtes add/updates/removals alors que la carte est sérialisée!

+0

Wel, bloquer ou faire la queue. C'est un point mineur, puisque la plupart des utilisateurs de telles cartes auront besoin d'un accès synchrone, mais cela vaut la peine d'être mentionné :) –