Merge pull request #348, AtomicPositiveInteger less memory used & provides better perf.
diff --git a/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/AtomicPositiveInteger.java b/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/AtomicPositiveInteger.java
index 016efc8..2ff9532 100644
--- a/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/AtomicPositiveInteger.java
+++ b/dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/AtomicPositiveInteger.java
@@ -16,163 +16,120 @@
*/
package com.alibaba.dubbo.common.utils;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-/**
- * AtomicPositiveInteger
- */
public class AtomicPositiveInteger extends Number {
private static final long serialVersionUID = -3038533876489105940L;
- private final AtomicInteger i;
+ private static final AtomicIntegerFieldUpdater<AtomicPositiveInteger> indexUpdater =
+ AtomicIntegerFieldUpdater.newUpdater(AtomicPositiveInteger.class, "index");
+
+ @SuppressWarnings("unused")
+ private volatile int index = 0;
public AtomicPositiveInteger() {
- i = new AtomicInteger();
}
public AtomicPositiveInteger(int initialValue) {
- i = new AtomicInteger(initialValue);
+ indexUpdater.set(this, initialValue);
}
public final int getAndIncrement() {
- for (; ; ) {
- int current = i.get();
- int next = (current >= Integer.MAX_VALUE ? 0 : current + 1);
- if (i.compareAndSet(current, next)) {
- return current;
- }
- }
+ return indexUpdater.getAndIncrement(this) & Integer.MAX_VALUE;
}
public final int getAndDecrement() {
- for (; ; ) {
- int current = i.get();
- int next = (current <= 0 ? Integer.MAX_VALUE : current - 1);
- if (i.compareAndSet(current, next)) {
- return current;
- }
- }
+ return indexUpdater.getAndDecrement(this) & Integer.MAX_VALUE;
}
public final int incrementAndGet() {
- for (; ; ) {
- int current = i.get();
- int next = (current >= Integer.MAX_VALUE ? 0 : current + 1);
- if (i.compareAndSet(current, next)) {
- return next;
- }
- }
+ return indexUpdater.incrementAndGet(this) & Integer.MAX_VALUE;
}
public final int decrementAndGet() {
- for (; ; ) {
- int current = i.get();
- int next = (current <= 0 ? Integer.MAX_VALUE : current - 1);
- if (i.compareAndSet(current, next)) {
- return next;
- }
- }
+ return indexUpdater.decrementAndGet(this) & Integer.MAX_VALUE;
}
public final int get() {
- return i.get();
+ return indexUpdater.get(this) & Integer.MAX_VALUE;
}
public final void set(int newValue) {
if (newValue < 0) {
throw new IllegalArgumentException("new value " + newValue + " < 0");
}
- i.set(newValue);
+ indexUpdater.set(this, newValue);
}
public final int getAndSet(int newValue) {
if (newValue < 0) {
throw new IllegalArgumentException("new value " + newValue + " < 0");
}
- return i.getAndSet(newValue);
+ return indexUpdater.getAndSet(this, newValue) & Integer.MAX_VALUE;
}
public final int getAndAdd(int delta) {
if (delta < 0) {
throw new IllegalArgumentException("delta " + delta + " < 0");
}
- for (; ; ) {
- int current = i.get();
- int next = (current >= Integer.MAX_VALUE - delta + 1 ? delta - 1 : current + delta);
- if (i.compareAndSet(current, next)) {
- return current;
- }
- }
+ return indexUpdater.getAndAdd(this, delta) & Integer.MAX_VALUE;
}
public final int addAndGet(int delta) {
if (delta < 0) {
throw new IllegalArgumentException("delta " + delta + " < 0");
}
- for (; ; ) {
- int current = i.get();
- int next = (current >= Integer.MAX_VALUE - delta + 1 ? delta - 1 : current + delta);
- if (i.compareAndSet(current, next)) {
- return next;
- }
- }
+ return indexUpdater.addAndGet(this, delta) & Integer.MAX_VALUE;
}
public final boolean compareAndSet(int expect, int update) {
if (update < 0) {
throw new IllegalArgumentException("update value " + update + " < 0");
}
- return i.compareAndSet(expect, update);
+ return indexUpdater.compareAndSet(this, expect, update);
}
public final boolean weakCompareAndSet(int expect, int update) {
if (update < 0) {
throw new IllegalArgumentException("update value " + update + " < 0");
}
- return i.weakCompareAndSet(expect, update);
+ return indexUpdater.weakCompareAndSet(this, expect, update);
}
- @Override
public byte byteValue() {
- return i.byteValue();
+ return (byte) get();
}
- @Override
public short shortValue() {
- return i.shortValue();
+ return (short) get();
}
- @Override
public int intValue() {
- return i.intValue();
+ return get();
}
- @Override
public long longValue() {
- return i.longValue();
+ return (long) get();
}
- @Override
public float floatValue() {
- return i.floatValue();
+ return (float) get();
}
- @Override
public double doubleValue() {
- return i.doubleValue();
+ return (double) get();
}
- @Override
public String toString() {
- return i.toString();
+ return Integer.toString(get());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
- result = prime * result + i.hashCode();
+ result = prime * result + get();
return result;
}
@@ -181,7 +138,6 @@
if (this == obj) return true;
if (!(obj instanceof AtomicPositiveInteger)) return false;
AtomicPositiveInteger other = (AtomicPositiveInteger) obj;
- return i.intValue() == other.i.intValue();
+ return intValue() == other.intValue();
}
-
-}
+}
\ No newline at end of file