ConcurrentHashMap原子获取,增量和替换

时间:2015-06-12 12:50:54

标签: java multithreading concurrency synchronization atomic

是否有一种简单的方法来获取,增加和替换ConcurrentHashMap

中的整数
ConcurrentHashMap<MyResource, AtomicInteger> map;

假设每个值都已经初始化为:

map.get(i) = new AtomicInteger(0);

并且我们不添加任何新密钥。

如何获取,增加和替换原子(和线程安全)?

这样的事情应该不起作用:

map.get(myResourceKey).incrementAndGet();

因为2个线程在递增之前可以获得相同的整数吗?

地图正在跟踪使用特定资源的线程数量。 而且我希望只有在没有使用资源时才会发生一些事情(counter = 0)。

2 个答案:

答案 0 :(得分:1)

您可以使用compute执行原始操作,就像您要求的那样。如果是第一次调用,compute方法将返回递增的值或1。

Map<MyResource, Integer> map = new ConcurrentHashMap<>();

map.compute(resourceKey, (k, v) -> v == null ? 1 : v + 1);

答案 1 :(得分:0)

AtomicInteger适用于多个线程,这就是它的目的。因此,如果地图没有变化,那你很好。

如果多个线程同时尝试修改映射,则会出现问题,例如两个线程将每个线程添加为自己的AtomicInteger。在这种情况下,请同步地图本身。