spring web模块中,AbstractNamedValueMethodArgumentResolver中有这样一段代码,其中namedValueInfoCache是ConcurrentHashMap的实例。
private NamedValueInfo getNamedValueInfo(MethodParameter parameter) {
NamedValueInfo namedValueInfo = this.namedValueInfoCache.get(parameter);
if (namedValueInfo == null) {
namedValueInfo = createNamedValueInfo(parameter);
namedValueInfo = updateNamedValueInfo(parameter, namedValueInfo);
this.namedValueInfoCache.put(parameter, namedValueInfo);
}
return namedValueInfo;
}
我认为在并发场景这样的使用方式是线程不安全的,对于同一个key(parameter),可能会多次执行put操作。是否spring为保证性能,认为这种重复操作是没问题的?
这个NamedValueInfo
放的是Controller中接口的入参约束,也就是@RequestParam(name="",required=true,defaultValue="0")
这里面的参数(name、required、defafultName)。
既然放的是这些东西,那程序启动后这些参数就不会变,就算多次update也完全没问题,都是同一个值,多次更新也没有变化。
ConcurrentHashMap本身是线程安全的
这里就算他存在竞争,应该问题也不大,首先只有同一个接口才会可能出现竞争,NamedValueInfo里面也只有name和defaultValue,并没有直接用NamedValueInfo这个对象,而且他在拿不到数据的时候,才会用到NamedValueInfo的默认值