嵌套时,ConcurrentHashMap的computeIfAbsent线程是否安全?

时间:2018-11-09 17:05:29

标签: java concurrency

我不熟悉使用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));

}

1 个答案:

答案 0 :(得分:0)

取决于您在此所说的原子性。

另一个线程可能会从myCache获取一个Map,而不会看到bizDate的条目。

如果您想在任何线程获取之前从myCache中完全填充地图,则需要在myCache.computeIfAbsent内部创建并填充它。