diff --git a/core/java/src/net/i2p/util/ObjectCounter.java b/core/java/src/net/i2p/util/ObjectCounter.java index ae7cc4c15..a97ba6151 100644 --- a/core/java/src/net/i2p/util/ObjectCounter.java +++ b/core/java/src/net/i2p/util/ObjectCounter.java @@ -2,33 +2,28 @@ package net.i2p.util; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; /** * Count things. * - * @author zzz + * @author zzz, welterde */ public class ObjectCounter { - private ConcurrentHashMap _map; - private static final Integer ONE = Integer.valueOf(1); + private ConcurrentHashMap map; public ObjectCounter() { - _map = new ConcurrentHashMap(); + this.map = new ConcurrentHashMap(); } /** * Add one. - * Not perfectly concurrent, new AtomicInteger(1) would be better, - * at the cost of some object churn. * @return count after increment */ public int increment(K h) { - Integer i = _map.putIfAbsent(h, ONE); - if (i != null) { - int rv = i.intValue() + 1; - _map.put(h, Integer.valueOf(rv)); - return rv; - } + AtomicInteger i = this.map.putIfAbsent(h, new AtomicInteger(1)); + if (i != null) + return i.incrementAndGet(); return 1; } @@ -36,9 +31,9 @@ public class ObjectCounter { * @return current count */ public int count(K h) { - Integer i = _map.get(h); + AtomicInteger i = this.map.get(h); if (i != null) - return i.intValue(); + return i.get(); return 0; } @@ -46,7 +41,7 @@ public class ObjectCounter { * @return set of objects with counts > 0 */ public Set objects() { - return _map.keySet(); + return this.map.keySet(); } /** @@ -54,7 +49,7 @@ public class ObjectCounter { * @since 0.7.11 */ public void clear() { - _map.clear(); + this.map.clear(); } }