Was ist die bevorzugte Methode zum Ändern eines Werts in ConcurrentHashMap?
Angenommen, ich habe eine Concurrent Map mit hohem Lesezugriff und niedrigem Schreibzugriff, in der Anwendungsdaten gespeichert werden müssen:
ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>();
Dann werden während des Startvorgangs und durch Benutzereingaben Daten zur Karte hinzugefügt:
public void createData(Data newData) {
map.put(newId, newData); // etc...
}
Wenn ich dann die Daten ändern muss, sollte ich:
A) Machen Sie die Datenklassenobjekte unveränderlich und führen Sie dann jedes Mal eine Put-Operation durch, wenn eine Änderung für ein Datenobjekt erforderlich ist:
public void changeData(UUID oldId, Foo newInfo) {
Data oldData = map.get(oldId);
Data newData = new Data(oldData, newInfo); // Constructor for demo only
map.put(newData);
saveToDatabase(newData);
}
B) Machen Sie die Datenklassenobjekte mit flüchtigen Feldern, atomaren Referenzen oder endgültigen gleichzeitigen Feldern veränderbar und dennoch threadsicher, und ändern Sie das Objekt einfach nach Bedarf:
public void changeData(UUID oldId, Foo newInfo) {
Data data = map.get(id);
data.changeSomething(newInfo);
saveToDatabase(data);
}
C) Keine der oben genannten