--- jsr166/src/jsr166e/LongAdder.java 2011/08/28 19:08:07 1.6 +++ jsr166/src/jsr166e/LongAdder.java 2014/05/05 20:20:15 1.17 @@ -5,11 +5,12 @@ */ package jsr166e; -import java.util.concurrent.atomic.AtomicLong; + import java.io.IOException; -import java.io.Serializable; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.concurrent.atomic.AtomicLong; /** * One or more variables that together maintain an initially zero @@ -19,7 +20,7 @@ import java.io.ObjectOutputStream; * #longValue}) returns the current total combined across the * variables maintaining the sum. * - *

This class is usually preferable to {@link AtomicLong} when + *

This class is usually preferable to {@link AtomicLong} when * multiple threads update a common sum that is used for purposes such * as collecting statistics, not for fine-grained synchronization * control. Under low update contention, the two classes have similar @@ -28,13 +29,14 @@ import java.io.ObjectOutputStream; * consumption. * *

This class extends {@link Number}, but does not define - * methods such as {@code hashCode} and {@code compareTo} because - * instances are expected to be mutated, and so are not useful as - * collection keys. + * methods such as {@code equals}, {@code hashCode} and {@code + * compareTo} because instances are expected to be mutated, and so are + * not useful as collection keys. * *

jsr166e note: This class is targeted to be placed in - * java.util.concurrent.atomic + * java.util.concurrent.atomic. * + * @since 1.8 * @author Doug Lea */ public class LongAdder extends Striped64 implements Serializable { @@ -57,12 +59,12 @@ public class LongAdder extends Striped64 * @param x the value to add */ public void add(long x) { - Cell[] as; long b, v; HashCode hc; Cell a; int n; + Cell[] as; long b, v; int[] hc; Cell a; int n; if ((as = cells) != null || !casBase(b = base, b + x)) { boolean uncontended = true; - int h = (hc = threadHashCode.get()).code; - if (as == null || (n = as.length) < 1 || - (a = as[(n - 1) & h]) == null || + if ((hc = threadHashCode.get()) == null || + as == null || (n = as.length) < 1 || + (a = as[(n - 1) & hc[0]]) == null || !(uncontended = a.cas(v = a.value, v + x))) retryUpdate(x, hc, uncontended); } @@ -84,7 +86,7 @@ public class LongAdder extends Striped64 /** * Returns the current sum. The returned value is NOT an - * atomic snapshot: Invocation in the absence of concurrent + * atomic snapshot; invocation in the absence of concurrent * updates returns an accurate result, but concurrent updates that * occur while the sum is being calculated might not be * incorporated. @@ -145,7 +147,7 @@ public class LongAdder extends Striped64 /** * Returns the String representation of the {@link #sum}. - * @return the String representation of the {@link #sum}. + * @return the String representation of the {@link #sum} */ public String toString() { return Long.toString(sum()); @@ -184,14 +186,13 @@ public class LongAdder extends Striped64 return (double)sum(); } - private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException { + private void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); s.writeLong(sum()); } private void readObject(ObjectInputStream s) - throws IOException, ClassNotFoundException { + throws IOException, ClassNotFoundException { s.defaultReadObject(); busy = 0; cells = null;