我不熟悉使用Map的computeIfAbsent方法。我确实发现(根据Java文档)整个方法调用是原子执行的。我想知道(而不是确认)下面的代码片段(在方法内部)是否会自动执行。
ConcurrentMap<RunMode, Map<LocalDate, Map<Integer, Set<DomainObject>>>> myCache = new ConcurrentHashmap<>();
public void addToCache(RunMode runMode,LocalDate bizDate,DomainObject bean){
Set<DomainObject> domainObjSet = myCache.computeIfAbsent(runMode, runModeMap-> new ConcurrentHashMap<>())
.computeIfAbsent(bizDate, bizDateMap-> new ConcurrentHashMap<>())
.computeIfAbsent(bean.getId(), domainSet-> Collections.synchronizedSet(new HashSet<>()).add(bean));
}
答案 0 :(得分:0)
取决于您在此所说的原子性。
另一个线程可能会从myCache
获取一个Map,而不会看到bizDate
的条目。
如果您想在任何线程获取之前从myCache
中完全填充地图,则需要在myCache.computeIfAbsent
内部创建并填充它。