Browse Source

优化counter api

zhouhao 8 years ago
parent
commit
557ad6c9d8

+ 24 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/AbstractCounterManager.java

@@ -0,0 +1,24 @@
+package org.hswebframework.web.concurrent.counter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhouhao
+ */
+public abstract class AbstractCounterManager implements CounterManager {
+
+    private final Map<String, Counter> counterStore = new HashMap<>(128);
+
+    @Override
+    public Counter getCounter(String name, long initValue) {
+        Counter counter = counterStore.get(name);
+        if (counter != null)
+            return counter;
+        synchronized (counterStore) {
+            return counterStore.computeIfAbsent(name, k -> this.createCount(name, initValue));
+        }
+    }
+
+    protected abstract Counter createCount(String name, long initValue);
+}

+ 5 - 7
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/Counter.java

@@ -17,19 +17,17 @@
 
 package org.hswebframework.web.concurrent.counter;
 
-import java.math.BigDecimal;
-
 /**
  * TODO 完成注释
  *
  * @author zhouhao
  */
 public interface Counter {
-    BigDecimal get();
+    long get();
 
-    void set(Number num);
+    void set(long num);
 
-    BigDecimal getAndAdd(long num);
+    long getAndAdd(long num);
 
     void add(long num);
 
@@ -37,8 +35,8 @@ public interface Counter {
 
     void decrement();
 
-    BigDecimal incrementAndGet();
+    long incrementAndGet();
 
-    BigDecimal decrementAndGet();
+    long decrementAndGet();
 
 }

+ 1 - 5
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/CounterManager.java

@@ -17,8 +17,6 @@
 
 package org.hswebframework.web.concurrent.counter;
 
-import java.util.Map;
-
 /**
  * TODO 完成注释
  *
@@ -26,11 +24,9 @@ import java.util.Map;
  */
 public interface CounterManager {
 
-    Map<String, Counter> getCounters();
-
     default Counter getCounter(String name) {
         return getCounter(name, 0);
     }
 
-    Counter getCounter(String name, Number initValue);
+    Counter getCounter(String name, long initValue);
 }

+ 52 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/SimpleCounter.java

@@ -0,0 +1,52 @@
+package org.hswebframework.web.concurrent.counter;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimpleCounter implements Counter {
+    private final AtomicLong counter = new AtomicLong();
+
+    @Override
+    public long get() {
+        return counter.get();
+    }
+
+    @Override
+    public void set(long num) {
+        counter.set(num);
+    }
+
+    @Override
+    public long getAndAdd(long num) {
+        return counter.getAndAdd(num);
+    }
+
+    @Override
+    public void add(long num) {
+        counter.addAndGet(num);
+    }
+
+    @Override
+    public void increment() {
+        counter.incrementAndGet();
+    }
+
+    @Override
+    public void decrement() {
+        counter.decrementAndGet();
+    }
+
+    @Override
+    public long incrementAndGet() {
+        return counter.incrementAndGet();
+    }
+
+    @Override
+    public long decrementAndGet() {
+        return counter.decrementAndGet();
+    }
+}

+ 13 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/main/java/org/hswebframework/web/concurrent/counter/SimpleCounterManager.java

@@ -0,0 +1,13 @@
+package org.hswebframework.web.concurrent.counter;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimpleCounterManager extends AbstractCounterManager {
+    @Override
+    protected Counter createCount(String name, long initValue) {
+        return new SimpleCounter();
+    }
+}

+ 25 - 0
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/src/test/java/org/hswebframework/web/concurrent/counter/SimpleCounterTest.java

@@ -0,0 +1,25 @@
+package org.hswebframework.web.concurrent.counter;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * TODO 完成注释
+ *
+ * @author zhouhao
+ */
+public class SimpleCounterTest {
+
+    private CounterManager counterManager = new SimpleCounterManager();
+
+    @Test
+    public void testSimple() throws InterruptedException {
+        for (int i = 0; i < 100; i++) {
+            new Thread(() -> counterManager.getCounter("test").increment()).start();
+        }
+
+        Thread.sleep(500);
+        Assert.assertEquals(counterManager.getCounter("test").get(), 100);
+    }
+
+}