public class test{
private Map<String,String> map=new HashMap<>();
public int useMap(){
//useMap不定期使用map
}
@Schedule
public void refreshMap(){
List<Employee> employeeList=client.getData();
for(Employee employee:employeeList){
map.put(employee.getName(),employee.getSalary);
}
}
}
上面的代码中一个函数随机高频使用map字段,另一个函数定期刷新map。刷新方式是获得数据后抽取数据直接写入map。
这段代码有个严重问题——如果刷新map过程中map被使用了,那么useMap获得的数据就不是一致的,map中部分是旧数据,部分是新数据,这违背了一致性原则。一致性原则要求数据要么都是旧的,要么都是新的。
正确写法:
public class test{
private Map<String,String> map=new HashMap<>();
public int useMap(){
//useMap不定期使用map
}
@Schedule
public void refreshMap(){
List<Employee> employeeList=client.getData();
Map<String,String> tempMap=new HashMap<>();
for(Employee employee:employeeList){
tempMap.put(employee.getName(),employee.getSalary);
}
map=tempMap;
}
}