Spring中为什么会这样使用ConcurrentHashMap

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的默认值

img