在java中,我需要计算每个键的项目,所以我想ConcurrentMap
用键和作为值来使用,AtomicInteger
但是我想知道是否有更好的方法。它不是一项关键服务,它只是用于收集统计数据,所以我不介意我是否迟到 10 秒才能获得正确的统计数据或类似的东西。所以我想知道在标准java并发中是否有更好的实践,或者我是否再次离开自己处理ConcurrentMap和AtomicInteger
(一个也可以解决问题的例子可能是消息传递,如果是的话怎么能这对我有帮助吗?)(最好举个例子......)一些不会有性能问题并且安全且易于使用的东西,我不介意延迟。
问问题
128 次
2 回答
4
Guava 提供了一个ConcurrentHashMultiset
. 这是一个并发Multiset
实现,它实际上是一个允许重复的集合。您可以add(E)
和remove(Object)
往常一样,还可以count(Object)
检索Multiset
.
实际上,这是使用 backing实现的ConcurrentHashMap<E, AtomicInteger>
,因此您的练习非常好。然而:
- 该
Multiset
接口提供了更好的抽象,它甚至可以扩展Collection
. - 自己妥善管理这些
AtomicIntegers
是一件棘手的事情。快速浏览一下 Guava 的代码应该会让您了解并发编程带来的挑战:您需要大量的compareAndSet
s 和无限while
循环来确保得到正确的结果。
于 2013-06-23T10:27:51.453 回答
0
是的,我认为这是正确的方向,所以我真的不明白你为什么认为这不容易。只需使用并发映射特定功能。即更新统计数据将是:
AtomicInteger newCounter = new AtomicInteger(1);
AtomicInteger existingCounter = map.putIfAbsent(key, newCounter);
if(existingCounter != null)
existingCounter.incrementAndGet();
于 2013-06-23T10:41:39.990 回答