Dans mon application, j'ai une carte de valeur-clé qui sert de référentiel central pour stocker des données qui sont utilisées pour revenir à un état défini après un plantage ou un redémarrage (point de contrôle).Comment puis-je effectuer un instantané thread-safe d'une carte de valeur-clé dans Java?
L'application est multithread et plusieurs threads peuvent mettre des paires clé-valeur dans cette carte. Un thread est responsable de la création régulière d'un point de contrôle, i. e. sérialiser la carte pour un stockage persistant. Pendant que le point de contrôle est en cours d'écriture, la carte doit rester inchangée. Il est plutôt facile d'éviter l'ajout de nouveaux éléments, mais qu'en est-il des autres threads qui changent les membres de "leurs" objets à l'intérieur de la map?
Je pourrais avoir un seul objet dont le moniteur est saisi lorsque le point de reprise commence et envelopper tous les accès en écriture à n'importe quel membre de la carte, et à ses membres, dans la synchronisation des blocs sur cet objet. Cela semble très sujet à erreur et fastidieux pour moi.
Je pourrais aussi rendre la carte privée au checkpointer et ne placer que des copies des objets soumis. Mais alors je devrais m'assurer que les copies sont des copies profondes et je ne serais pas capable d'avoir les données dans la carte étant automatiquement mises à jour, à chaque changement aux objets soumis, les soumissionnaires devraient les soumettre de nouveau. Cela semble beaucoup de frais généraux et aussi sujettes aux erreurs, car je dois me rappeler de remettre le code dans tous les bons endroits.
Qu'est-ce qu'un moyen élégant et fiable de résoudre ce problème?
+1 objets immuables, la carte est un instantané de l'état. Travaillez votre clone/serialization et rappelez-vous de lire sur le mot-clé transitoire – basszero