[英]what is the best practice for counting per key in java
在java中,我需要计算每个键的项目,所以我想使用带键的ConcurrentMap
和作为值来使用AtomicInteger
但是我想知道是否有更好的方法。 它不是一个关键的服务,它只是用于收集统计数据,所以我不介意我是否有10秒正确的统计数据或类似的东西。 所以我想知道在标准的Java并发中是否有更好的实践,或者我是否再次使用ConcurrentMap和AtomicInteger
(一个也可以解决问题的例子可能是消息传递,如果是的话可以帮助我吗?)(最好用例子......)一些不会出现性能问题而且安全性也好,并且易于使用的东西,我不介意延迟。
Guava提供了ConcurrentHashMultiset
。 这是一个并发的Multiset
实现,它实际上是一个允许重复的集合。 您可以像往常一样add(E)
和remove(Object)
,但也可以检索Multiset
元素的count(Object)
。
事实上, 这是使用支持ConcurrentHashMap<E, AtomicInteger>
,所以你的练习完全没问题。 然而:
Multiset
接口提供了更好的抽象,它甚至扩展了Collection
。 AtomicIntegers
是一件棘手的事情。 快速浏览一下Guava的代码应该让你了解并发编程所带来的挑战:你需要大量的compareAndSet
和无限的while
循环来确保正确的结果出来。 是的,我认为这是正确的方向,所以我真的不明白你为什么认为这不容易。 只需使用并发映射特定功能。 即更新统计数据将是:
AtomicInteger newCounter = new AtomicInteger(1);
AtomicInteger existingCounter = map.putIfAbsent(key, newCounter);
if(existingCounter != null)
existingCounter.incrementAndGet();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.