繁体   English   中英

ConcurrentHashMap原子获取,增加和替换

[英]ConcurrentHashMap atomic get, increment and replace

有没有一种简单的方法可以从ConcurrentHashMap获取,递增和替换整数?

ConcurrentHashMap<MyResource, AtomicInteger> map;

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

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

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

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

像这样的东西不起作用:

map.get(myResourceKey).incrementAndGet();

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

该映射跟踪使用特定资源的线程数。 我希望仅在不使用资源(计数器= 0)时才发生某些事情。

您可以使用计算执行原子操作,就像您要的那样。 计算方法将返回递增的值,如果是第一个调用,则返回1。

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

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

AtomicInteger可以在多个线程上正常工作,这就是它的目的。 因此,如果地图不变,那很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM