ConcurrentHashMap:在 Java 中的嵌套 concurrentHashMap 上使用 merge()
ConcurrentHashMap: Using merge() on a nested concurrentHashMap in Java
我有一个这样的 concurrentHashMap:
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);
}});
}
基本上,检查 "key" 是否存在,然后检查 longKey 是否存在于嵌套的 concurrentHashMap 中,如果是,则所有 1l 到现有值。否则,放 1l。如果 "key" 不存在,则使用新值创建一个新的 concurrentHashMap。
我如何使用合并方法 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-K-V-java.util.function.BiFunction- 来做同样的事情?因为我希望获取和更新是原子的。
据我了解,您可以使用以下代码以 thread-safe 方式执行此操作:
Map<Long, Long> longMap =
hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);
您应该认真考虑只使用普通同步。如果您在编写 thread-safe 代码方面没有经验,那么简单的同步要容易得多。例如,如果您使用 Collections.synchronizedMap
,您可以在需要执行多个方法调用时随时执行 synchronized (map) {...}
。
我有一个这样的 concurrentHashMap:
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);
}});
}
基本上,检查 "key" 是否存在,然后检查 longKey 是否存在于嵌套的 concurrentHashMap 中,如果是,则所有 1l 到现有值。否则,放 1l。如果 "key" 不存在,则使用新值创建一个新的 concurrentHashMap。
我如何使用合并方法 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-K-V-java.util.function.BiFunction- 来做同样的事情?因为我希望获取和更新是原子的。
据我了解,您可以使用以下代码以 thread-safe 方式执行此操作:
Map<Long, Long> longMap =
hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);
您应该认真考虑只使用普通同步。如果您在编写 thread-safe 代码方面没有经验,那么简单的同步要容易得多。例如,如果您使用 Collections.synchronizedMap
,您可以在需要执行多个方法调用时随时执行 synchronized (map) {...}
。