假设我有一个高读,低写并且需要存储应用程序数据的并发映射:

ConcurrentMap map = new ConcurrentHashMap();

然后,在启动期间和通过用户输入,数据将添加到地图中:

public void createData(Data newData) {
map.put(newId, newData); // etc...
}

如果我需要更改数据,我应该:

A)使Data类对象不可变,然后每次需要对Data对象进行更改时执行put操作:

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)使用volatile字段,原子引用或最终并发字段使Data类对象可变但是线程安全,并根据需要简单地修改对象:

public void changeData(UUID oldId, Foo newInfo) {
Data data = map.get(id);
data.changeSomething(newInfo);
saveToDatabase(data);
}

C)以上都不是