【发布时间】:2011-03-21 08:49:53
【问题描述】:
我想从网络应用程序的不同位置收集一些指标。为简单起见,所有这些都是计数器,因此唯一的修饰符操作是将它们递增 1。
增量将是并发的并且经常发生。读取(转储统计信息)是一种罕见的操作。
我正在考虑使用 ConcurrentHashMap。问题是如何正确递增计数器。由于地图没有“增量”操作,我需要先读取当前值,然后将其递增而不是将新值放入地图中。没有更多代码,这不是原子操作。
是否可以在不同步的情况下实现这一点(这会破坏 ConcurrentHashMap 的目的)?我需要看Guava吗?
感谢您的任何指点。
附言
有一个关于 SO (Most efficient way to increment a Map value in Java) 的相关问题,但关注的是性能而不是多线程
更新
对于那些通过搜索相同主题到达这里的人:除了下面的答案之外,还有一个有用的presentation 顺便涵盖了相同的主题。见幻灯片 24-33。
【问题讨论】:
标签: java multithreading concurrency guava concurrenthashmap