Безопасен ли поток ConcurrentHashMap computeIfAbsent при вложении? - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в использовании метода 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 голосов
/ 09 ноября 2018

Зависит от того, что вы подразумеваете под атомностью здесь.

Возможно, что другие потоки получат карту от myCache, которая не увидит запись для bizDate.

Если вы хотите полностью заполнить карту из myCache до того, как какой-либо поток ее получит, вам нужно создать и заполнить ее внутри myCache.computeIfAbsent.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...