在ConcurrentHashMap中原子递增计数器。

29 浏览
0 Comments

在ConcurrentHashMap中原子递增计数器。

我想从网络应用的不同地方收集一些指标数据。为了保持简单,所有这些数据都是计数器,因此唯一的修改器操作是将它们增加1。

增量操作将是并发的,并且经常发生。读取(转储统计信息)是一项罕见的操作。

我想使用ConcurrentHashMap。问题在于如何正确递增计数器。由于该映射表没有“递增”操作,我需要先读取当前值,然后将其递增并将新值放入映射表中。如果没有更多的代码,这不是一个原子操作。

有没有可能在不同步的情况下实现这一点(这将使ConcurrentHashMap失效)?我需要看看Guava吗?

感谢任何提示。

P.S.

SO上有一个相关问题(最有效的Java地图值递增方式),但重点在于性能而不是多线程

更新

对于通过相同主题的搜索到达此处的人们:除了下面的答案之外,还有一个有用的演示文稿,恰好涵盖了同一主题。请参见幻灯片24-33。

admin 更改状态以发布 2023年5月22日
0
0 Comments

Guava的新AtomicLongMap(在版本11中)可能解决这个需求。

0
0 Comments

在Java 8中:\n

ConcurrentHashMap map = new ConcurrentHashMap<>();
map.computeIfAbsent("key", k -> new LongAdder()).increment();

0