首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentHashMap:在Java中嵌套的concurrentHashMap上使用merge()

ConcurrentHashMap:在Java中嵌套的concurrentHashMap上使用merge()
EN

Stack Overflow用户
提问于 2018-04-02 19:09:30
回答 1查看 823关注 0票数 0

我有一个这样的concurrentHashMap:

代码语言:javascript
复制
ConcurrentHashMap<String, ConcurrentHashMap<Long, Long>> hashMap = new ConcurrentHashMap<>()

如果已经存在,我需要根据当前值更新嵌套的hashmap的值。我现在正在做这样的事情:

代码语言:javascript
复制
 if (hashMap.containsKey("key")) {

        long count = (hashMap.get("key").containsKey(longKey)) ?
                    (hashMap.get("key").get(longKey) + 1l) :
                    1l;

        hashMap.put("key", new ConcurrentHashMap<Long, Long>() {{
            put(longKey, count);
        }});
    }

基本上,检查"key“是否存在,然后检查longKey是否存在于嵌套concurrentHashMap中,如果是,则所有1l都对应于现有值。否则,放1l。如果“键”不存在,则创建一个具有新值的新concurrentHashMap。

如何使用合并方法https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-K-V-java.util.function.BiFunction-进行同样的操作?因为我希望获取和更新是原子的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 19:19:31

正如我所理解的,您可以使用以下代码以线程安全的方式执行此操作:

代码语言:javascript
复制
Map<Long, Long> longMap =
    hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);

您应该认真考虑仅仅使用简单的同步。如果您没有编写线程安全代码的经验,那么简单的同步就容易得多。例如,如果您使用一个Collections.synchronizedMap,您可以在任何需要执行不止一个方法调用的时候执行synchronized (map) {...}

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49617287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档