[英]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.