簡體   English   中英

在java中計算每個鍵的最佳實踐是什么?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM