HashMap nicht THREAD ist, siehe the API documentation:
Beachten Sie, dass diese Implementierung nicht synchronisiert ist. Wenn mehrere Threads gleichzeitig auf eine Hash-Map zugreifen und mindestens einer der Threads die Map strukturell ändert, muss sie extern synchronisiert werden. (Eine strukturelle Änderung ist jede Operation, die eine oder mehrere Zuordnungen hinzufügt oder löscht; lediglich das Ändern des Werts eines Schlüssels, den eine Instanz bereits enthält, ist keine strukturelle Änderung.) Dies wird in der Regel durch die Synchronisierung eines Objekts erreicht, das die Zuordnung natürlich kapselt . Wenn kein solches Objekt vorhanden ist, sollte die Map mit der Collections.synchronizedMap-Methode "umgebrochen" werden. Dies ist am besten zum Zeitpunkt der Erstellung getan, versehentlichen nicht synchronisierten Zugriff auf die Karte, um zu verhindern:
Map m = Collections.synchronizedMap(new HashMap(...));
Die Einsätze in die Karte, die Sie beschreiben, als strukturelle Modifikationen zählen würde.
Verwenden Sie stattdessen eine , Updates sperren nicht die gesamte Datenstruktur, wie der obige Code mit der synchronizedMap
wird.
Wenn das Problem besteht, dass der neue Wert nicht in den Cache gelangt, bevor andere Threads ihn verwenden müssen, nur weil die Threads in schneller Folge auf denselben Code zugreifen, ist es möglicherweise besser, mit dem Cache zu leben vermisst, als einen Engpass einzuführen. Es ist möglicherweise besser, das Ergebnis beim Einfügen nicht zwischenzuspeichern, sondern auf die erste ausgewählte Abfrage zu warten (in einer neuen Transaktion, nachdem die Einfügung festgeschrieben wurde). So vermeiden Sie den Fall, dass Sie einen Eintrag zu Ihrem Cache hinzufügen und die Transaktion rückgängig macht Sie erhalten ungültige Daten im Cache.
Es besteht auch die Gefahr, dass viele speicherspeichernde Einträge verwendet werden, die nicht verwendet werden. Sie könnten einen Worker-Thread regelmäßig nach abgelaufenen Elementen suchen lassen.
Caching ist eines der Dinge, die schwieriger sind, als es aussieht. Erwägen Sie die Verwendung von ehcache als Alternative zum Rollieren Ihrer eigenen Lösung hier.
Bitte Postleitzahl – Chinni
ist es ConcurrentHashMap? Was ist der Umfang der Klasse? Machst du nach dem Aktualisieren des Cache Logging? Wenn ja, kannst du die ID sehen? – HRgiger
Ja, wenn ich eine Protokollierung mache, sehe ich, dass die neuesten Werte in der Karte vorhanden sind. Aber ich versuche, den Wert mithilfe der Methode ma.getValues () abzurufen, die der neu hinzugefügte Wert nicht reflektiert. – VKR