标注@Cachable且返回HashMap的方法是否线程安全?是否需用ConcurrentMap?
@Cacheable方法返回类型与线程安全性的关系
核心结论
你的观点没错,在缓存内容运行时不会变更的前提下,返回HashMap<String, MyDTO>是完全可行的,不会影响多线程复用同一缓存值、避免重复计算。
具体分析
1. sync属性的作用
@Cacheable的sync属性是用来控制缓存加载阶段的线程安全:当多个线程请求同一个缓存键时,只会让一个线程执行底层方法加载数据,其他线程等待,直到缓存值写入后直接复用。这个过程和方法返回的集合类型无关,它保证的是不会出现同一键被多次计算的情况。
2. 缓存容器与返回值的关系
默认的@Cacheable实现用ConcurrentHashMap作为缓存容器,这保证了缓存本身的线程安全读写。而方法返回的HashMap只是被存入缓存的值对象:
- 一旦值被存入缓存,后续所有线程都是从
ConcurrentHashMap中读取这个已存在的HashMap实例; - 因为缓存内容运行中不会变更,所以不存在多个线程同时修改这个
HashMap的场景,自然不需要它是线程安全的集合类型。
3. 什么时候需要返回ConcurrentMap
只有当缓存的集合值本身会在运行时被多个线程修改时,才需要返回ConcurrentMap这类线程安全的集合。比如,缓存的Map会被后续业务逻辑添加/删除键值对,这时如果用普通HashMap就会有并发修改的风险。但你的场景中缓存内容不变,所以完全不需要。
内容的提问来源于stack exchange,提问作者Kaepxer
相关产品推荐
相关产品推荐

