我有一个这样的concurrentHashMap:
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“是否存在,然后检查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-进行同样的操作?因为我希望获取和更新是原子的。
发布于 2018-04-02 19:19:31
正如我所理解的,您可以使用以下代码以线程安全的方式执行此操作:
Map<Long, Long> longMap =
hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);您应该认真考虑仅仅使用简单的同步。如果您没有编写线程安全代码的经验,那么简单的同步就容易得多。例如,如果您使用一个Collections.synchronizedMap,您可以在任何需要执行不止一个方法调用的时候执行synchronized (map) {...}。
https://stackoverflow.com/questions/49617287
复制相似问题