我想从网络应用程序的各个地方收集一些指标。为简单起见,所有这些都是计数器,因此唯一的修饰符操作是将它们增加 1。
增量将是并发的并且经常发生。读取(转储统计信息)是一种罕见的操作。
我正在考虑使用ConcurrentHashMap。问题是如何正确增加计数器。由于地图没有“增量”操作,我需要先读取当前值,然后将其递增而不是将新值放入地图中。如果没有更多代码,这不是原子操作。
是否可以在不同步的情况下实现这一点(这会破坏ConcurrentHashMap的目的)?我需要看番石榴吗?
感谢您的任何指示。
PS
有一个关于SO(在Java中增加Map值的最有效方法)的相关问题,但专注于性能而不是多线程
更新
对于那些通过搜索同一主题到达这里的人:除了下面的答案之外,还有一个有用的演示文稿,顺便涵盖了同一主题。见幻灯片 24-33。