繁体   English   中英

ConcurrentHashMap:在Java中的嵌套并发HashMap上使用merge()

[英]ConcurrentHashMap: Using merge() on a nested concurrentHashMap in Java

我有一个并发HashMap像这样:

ConcurrentHashMap<String, ConcurrentHashMap<Long, Long>> hashMap = new ConcurrentHashMap<>()

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

 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);
        }});
    }

基本上,检查是否存在“键”,然后检查longKey是否存在于嵌套的并发HashMap中,如果是,则将所有1l都保留为现有值。 否则,放1升。 如果不存在“键”,则使用新值创建一个新的currentHashMap。

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

据我了解的问题,您可以使用以下代码以线程安全的方式执行此操作:

Map<Long, Long> longMap =
    hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM