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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage