From e03e9f258349d81f0b77701742244bd5e35e5e8a Mon Sep 17 00:00:00 2001 From: wusheng Date: Wed, 24 Feb 2016 15:24:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85#31=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E3=80=82=E4=BF=AE=E5=A4=8D=E8=BE=B9=E7=95=8C?= =?UTF-8?q?BUG=E3=80=82=E5=B9=B6=E6=8F=90=E4=BA=A4=E6=9B=B4=E5=90=88?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skywalking/util/AtomicRangeInteger.java | 14 ++++++------- .../util/AtomicRangeIntegerTest.java | 20 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/AtomicRangeInteger.java b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/AtomicRangeInteger.java index bf1fe360d..ac69b97ce 100644 --- a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/AtomicRangeInteger.java +++ b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/util/AtomicRangeInteger.java @@ -21,11 +21,14 @@ public class AtomicRangeInteger extends Number implements java.io.Serializable { * * @param initialValue * the initial value + * @param endValue + * + * AtomicRangeInteger在startValue和maxValue循环取值( startValue <= value < maxValue) */ - public AtomicRangeInteger(int startValue, int endValue) { + public AtomicRangeInteger(int startValue, int maxValue) { value = new AtomicInteger(startValue); this.startValue = startValue; - this.endValue = endValue; + this.endValue = maxValue - 1; } /** @@ -35,11 +38,8 @@ public class AtomicRangeInteger extends Number implements java.io.Serializable { */ public final int getAndIncrement() { for (;;) { - int current = get(); - int next = current + 1; - if (next >= this.endValue) { - next = this.startValue; - } + int current = value.get(); + int next = current >= this.endValue ? this.startValue : current + 1; if (value.compareAndSet(current, next)) return current; } diff --git a/skywalking-protocol/src/test/java/test/ai/cloud/skywalking/util/AtomicRangeIntegerTest.java b/skywalking-protocol/src/test/java/test/ai/cloud/skywalking/util/AtomicRangeIntegerTest.java index c3e9330d2..bbaeeb392 100644 --- a/skywalking-protocol/src/test/java/test/ai/cloud/skywalking/util/AtomicRangeIntegerTest.java +++ b/skywalking-protocol/src/test/java/test/ai/cloud/skywalking/util/AtomicRangeIntegerTest.java @@ -9,6 +9,10 @@ import junit.framework.TestCase; import com.ai.cloud.skywalking.util.AtomicRangeInteger; public class AtomicRangeIntegerTest extends TestCase{ + static String[] buffer = new String[5000]; + + static AtomicRangeInteger ari = new AtomicRangeInteger(0, buffer.length); + public void testGet(){ AtomicRangeInteger ari = new AtomicRangeInteger(0, 12); for(int i = 0; i < 51; i++){ @@ -36,22 +40,20 @@ public class AtomicRangeIntegerTest extends TestCase{ } class RangeIntegerThread extends Thread{ - private static String[] buffer = new String[500000000]; - - private static AtomicRangeInteger ari = new AtomicRangeInteger(0, buffer.length); - @Override public void run(){ while(true){ - int i = ari.getAndIncrement(); + int i = AtomicRangeIntegerTest.ari.getAndIncrement(); if(i % 10000000 == 0){ - System.out.println(ari.get()); + System.out.println(AtomicRangeIntegerTest.ari.get()); } - if(i >= buffer.length - 100000){ + if(AtomicRangeIntegerTest.buffer[i] != null){ + System.out.println("end at index:" + i + "," + AtomicRangeIntegerTest.buffer[i]); break; + }else{ + System.out.println("at index:" + i); + AtomicRangeIntegerTest.buffer[i] = "string"; } - Assert.assertNull(buffer[i]); - buffer[i] = "string"; } } }