假设我有一个高读低写的并发映射,需要存储应用程序数据:
ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>();
然后,在启动期间并通过用户输入,将数据添加到地图中:
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) 以上都不是