gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:51:30 26 4
gpt4 key购买 nike

我有一个像这样的并发HashMap:

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

我需要根据当前值(如果已存在)更新嵌套 HashMap 的值。我目前正在做这样的事情:

 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”是否存在,然后检查嵌套的并发HashMap中是否存在longKey,如果存在,则将所有1l改为现有值。否则,放1升。如果“key”不存在,则使用新值创建一个新的并发HashMap。

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

最佳答案

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

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

您应该认真考虑仅使用普通同步。如果您在编写线程安全代码方面缺乏经验,那么简单的同步要容易得多。如果您使用 Collections.synchronizedMap例如,当您需要执行多个方法调用时,您可以随时执行 synchronized (map) {...} 操作。

关于java - ConcurrentHashMap:在 Java 中的嵌套并发 HashMap 上使用 merge(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com