我有这样的concurrentHashMap:
<delete includeemptydirs="true" followsymlinks="false">
<fileset
dir="${apache.base}"
includes="**/*"
excludes="**/FOO.xml,**/BAR.xml"
/>
</delete>
我需要根据当前值(如果已存在)更新嵌套hashmap的值。我目前正在做这样的事情:
ConcurrentHashMap<String, ConcurrentHashMap<Long, Long>> hashMap = new ConcurrentHashMap<>()
基本上,检查是否存在“key”,然后检查嵌套的concurrentHashMap中是否存在longKey,如果是,则检查现有值是否为1。另外,放1l。如果“key”不存在,请使用新值创建一个新的concurrentHashMap。
如何使用合并方法https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-K-V-java.util.function.BiFunction-执行相同的操作?因为我想得到和更新是原子的。
答案 0 :(得分:4)
据我所知,您可以使用以下代码以线程安全的方式执行此操作:
Map<Long, Long> longMap =
hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);
您应该认真考虑使用普通同步。如果您没有编写线程安全代码的经验,那么简单同步就更容易实现。例如,如果您使用Collections.synchronizedMap
,则只需执行一次方法调用,就可以执行synchronized (map) {...}
。