In meiner Anwendung habe ich eine Schlüssel-Wert-Karte, die als zentrales Repository zum Speichern von Daten dient, die verwendet wird, um nach einem Absturz oder Neustart (Checkpointing) in einen definierten Zustand zurückzukehren.Wie kann ich einen threadsafe Point-in-Time-Snapshot einer Schlüssel-Wert-Map in Java durchführen?
Die Anwendung ist Multithread und mehrere Threads können Schlüssel-Wert-Paare in diese Zuordnung einfügen. Ein Thread ist verantwortlich für das regelmäßige Erstellen eines Checkpoints, d. e. Serialisieren Sie die Karte in den persistenten Speicher.
Während der Prüfpunkt geschrieben wird, sollte die Karte unverändert bleiben. Es ist ziemlich einfach zu vermeiden, dass neue Elemente hinzugefügt werden, aber was ist mit anderen Threads, die Mitglieder von "ihren" Objekten in der Karte ändern?
Ich könnte ein einzelnes Objekt haben, dessen Monitor erfasst wird, wenn der Checkpointing beginnt, und den gesamten Schreibzugriff auf ein Mitglied der Map und deren Mitglieder in Blöcken umwandeln, die auf diesem Objekt synchronisieren. Dies scheint mir sehr fehleranfällig und langwierig zu sein.
Ich könnte auch die Karte privat zum Checkpointer machen und nur Kopien der eingereichten Objekte hineinlegen. Aber dann müsste ich sicherstellen, dass die Kopien tiefe Kopien sind und ich nicht in der Lage wäre, die Daten in der Karte automatisch zu aktualisieren, bei jeder Änderung an den übermittelten Objekten müssten die Übermittler sie erneut einreichen. Dies scheint eine Menge Overhead zu sein und auch fehleranfällig zu sein, da ich mich daran erinnern muss, den Code an den richtigen Stellen erneut zu senden.
Was ist eine elegante und zuverlässige Lösung?
+1 unveränderliche Objekte, die Karte ist Snapshot des Zustands. Erarbeiten Sie Ihre Klon/Serialisierung und denken Sie daran, über das vorübergehende Schlüsselwort zu lesen – basszero