ConcurrentHashMap 原子获取、增量和替换

问题描述 投票:0回答:2

有没有一种简单的方法可以从

ConcurrentHashMap
中获取、递增和替换整数?

ConcurrentHashMap<MyResource, AtomicInteger> map;

假设每个值都已经像这样初始化了:

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

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

如何进行获取、递增和替换原子操作(并且线程安全)?

像这样的东西,不应该工作:

map.get(myResourceKey).incrementAndGet();

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

映射跟踪有多少线程正在使用特定资源。 我希望仅在未使用资源时(计数器 = 0)发生某些事情。

java multithreading concurrency synchronization atomic
2个回答
4
投票

您可以使用计算来执行您所要求的原子操作。计算方法将返回递增的值,如果是第一次调用,则返回 1。

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

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

1
投票

AtomicInteger 可以在多线程中正常工作,这就是它的目的。因此,如果地图没有改变,那就没问题。

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

© www.soinside.com 2019 - 2024. All rights reserved.