--- jsr166/src/jsr166e/LongAdderTable.java 2011/07/31 14:20:01 1.1 +++ jsr166/src/jsr166e/LongAdderTable.java 2011/08/29 17:06:20 1.3 @@ -4,9 +4,8 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ -package jsr166e.extra; +package jsr166e; import jsr166e.LongAdder; -import java.util.concurrent.ConcurrentHashMap; import java.util.Map; import java.util.Set; import java.io.Serializable; @@ -27,18 +26,21 @@ public class LongAdderTable implement /** Relies on default serialization */ private static final long serialVersionUID = 7249369246863182397L; - /** Concurrency parameter for map -- we assume high contention */ - private static final int MAP_SEGMENTS = - Math.max(16, Runtime.getRuntime().availableProcessors()); - /** The underlying map */ - private final ConcurrentHashMap map; + private final ConcurrentHashMapV8 map; + + static final class CreateAdder + implements ConcurrentHashMapV8.MappingFunction { + public LongAdder map(Object unused) { return new LongAdder(); } + } + + private static final CreateAdder createAdder = new CreateAdder(); /** * Creates a new empty table. */ public LongAdderTable() { - map = new ConcurrentHashMap(16, 0.75f, MAP_SEGMENTS); + map = new ConcurrentHashMapV8(); } /** @@ -69,11 +71,8 @@ public class LongAdderTable implement */ public void add(K key, long x) { LongAdder a = map.get(key); - if (a == null) { - LongAdder r = new LongAdder(); - if ((a = map.putIfAbsent(key, r)) == null) - a = r; - } + if (a == null) + a = map.computeIfAbsent(key, createAdder); a.add(x); }