是否有一种简单的方法来获取,增加和替换ConcurrentHashMap
?
ConcurrentHashMap<MyResource, AtomicInteger> map;
假设每个值都已经初始化为:
map.get(i) = new AtomicInteger(0);
并且我们不添加任何新密钥。
如何获取,增加和替换原子(和线程安全)?
这样的事情应该不起作用:
map.get(myResourceKey).incrementAndGet();
因为2个线程在递增之前可以获得相同的整数吗?
地图正在跟踪使用特定资源的线程数量。 而且我希望只有在没有使用资源时才会发生一些事情(counter = 0)。
答案 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。在这种情况下,请同步地图本身。