< prev index next >
src/java.base/share/classes/java/util/concurrent/atomic/LongAdder.java
Print this page
8192943: Optimize atomic accumulators using VarHandle getAndSet
Reviewed-by: martin, psandoz, chegar
@@ -81,16 +81,16 @@
* Adds the given value.
*
* @param x the value to add
*/
public void add(long x) {
- Cell[] as; long b, v; int m; Cell a;
- if ((as = cells) != null || !casBase(b = base, b + x)) {
+ Cell[] cs; long b, v; int m; Cell c;
+ if ((cs = cells) != null || !casBase(b = base, b + x)) {
boolean uncontended = true;
- if (as == null || (m = as.length - 1) < 0 ||
- (a = as[getProbe() & m]) == null ||
- !(uncontended = a.cas(v = a.value, v + x)))
+ if (cs == null || (m = cs.length - 1) < 0 ||
+ (c = cs[getProbe() & m]) == null ||
+ !(uncontended = c.cas(v = c.value, v + x)))
longAccumulate(x, null, uncontended);
}
}
/**
@@ -115,16 +115,16 @@
* incorporated.
*
* @return the sum
*/
public long sum() {
- Cell[] as = cells;
+ Cell[] cs = cells;
long sum = base;
- if (as != null) {
- for (Cell a : as)
- if (a != null)
- sum += a.value;
+ if (cs != null) {
+ for (Cell c : cs)
+ if (c != null)
+ sum += c.value;
}
return sum;
}
/**
@@ -133,16 +133,16 @@
* effective if there are no concurrent updates. Because this
* method is intrinsically racy, it should only be used when it is
* known that no threads are concurrently updating.
*/
public void reset() {
- Cell[] as = cells;
+ Cell[] cs = cells;
base = 0L;
- if (as != null) {
- for (Cell a : as)
- if (a != null)
- a.reset();
+ if (cs != null) {
+ for (Cell c : cs)
+ if (c != null)
+ c.reset();
}
}
/**
* Equivalent in effect to {@link #sum} followed by {@link
@@ -153,19 +153,16 @@
* the reset.
*
* @return the sum
*/
public long sumThenReset() {
- Cell[] as = cells;
- long sum = base;
- base = 0L;
- if (as != null) {
- for (Cell a : as) {
- if (a != null) {
- sum += a.value;
- a.reset();
- }
+ Cell[] cs = cells;
+ long sum = getAndSetBase(0L);
+ if (cs != null) {
+ for (Cell c : cs) {
+ if (c != null)
+ sum += c.getAndSet(0L);
}
}
return sum;
}
< prev index next >