我是使用Map的computeIfAbsent方法的新手。我确实发现(根据Java文档)整个方法调用是原子执行的。我想知道(而不是确认)下面的代码片段(在方法内部)是否会自动执行。
ConcurrentMap<RunMode, Map<LocalDate, Map<Integer, Set<DomainObject>>>> myCache = new ConcurrentHashmap<>();
public void addToCache(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));
}
最佳答案
取决于您在此所说的原子性。
另一个线程可能会从myCache
获取一个Map,而该Map将看不到bizDate
的条目。
如果要在任何线程获取之前从myCache
中完全填充Map,则需要在myCache.computeIfAbsent
中创建并填充它。
关于java - 嵌套时,ConcurrentHashMap的computeIfAbsent线程是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53230309/