[英]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.