1

在java中,我需要计算每个键的项目,所以我想ConcurrentMap用键和作为值来使用,AtomicInteger但是我想知道是否有更好的方法。它不是一项关键服务,它只是用于收集统计数据,所以我不介意我是否迟到 10 秒才能获得正确的统计数据或类似的东西。所以我想知道在标准java并发中是否有更好的实践,或者我是否再次离开自己处理ConcurrentMap和AtomicInteger(一个也可以解决问题的例子可能是消息传递,如果是的话怎么能这对我有帮助吗?)(最好举个例子......)一些不会有性能问题并且安全且易于使用的东西,我不介意延迟。

4

2 回答 2

4

Guava 提供了一个ConcurrentHashMultiset. 这是一个并发Multiset实现,它实际上是一个允许重复的集合。您可以add(E)remove(Object)往常一样,还可以count(Object)检索Multiset.

实际上,这是使用 backing实现的ConcurrentHashMap<E, AtomicInteger>,因此您的练习非常好。然而:

  • Multiset接口提供了更好的抽象,它甚至可以扩展Collection.
  • 自己妥善管理这些AtomicIntegers是一件棘手的事情。快速浏览一下 Guava 的代码应该会让您了解并发编程带来的挑战:您需要大量的compareAndSets 和无限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 回答