比方说,我有一个并发地图是高读取,低写入,并需要存储应用程序数据:在ConcurrentHashMap中修改值的首选方法是什么?
ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>();
,然后在启动过程中,通过用户输入的数据添加到地图:
public void createData(Data newData) {
map.put(newId, newData); // etc...
}
如果我那么需要改变的数据,我应该:
A)使数据类对象不变,然后在每次需要针对数据对象发生变化时进行卖出操作:
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)使数据类对象可变但线程安全挥发性字段,原子的引用或最终并发领域,并简单地修改为所需要的对象:
public void changeData(UUID oldId, Foo newInfo) {
Data data = map.get(id);
data.changeSomething(newInfo);
saveToDatabase(data);
}
C)的上述无
取决于你想实现的目标:) – zapl
我想实现一个与ConcurrentHashMap的保证一致的get/put关系,但我只是不确定进行对象操作/创建的顺序或正确的方式。 – oberger
如果您使用不可变的路线并拥有多个写入线程,则可能需要使用replace方法而不是put来确保您正在替换修改的值。 –