chickenlj closed pull request #348: AtomicPositiveInteger less memory used & 
provides better perf
URL: https://github.com/apache/incubator-dubbo/pull/348
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 016efc8ab0..2ff9532ba9 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 @@ public boolean equals(Object obj) {
         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


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to