多執行緒併發安全計數器實現限流(二) 使用 J.U.C中的AtomicInteger實現計數器
阿新 • • 發佈:2020-09-06
一、使用 J.U.C中的 atomicInteger 實現計數器
由於(一)中的計數器不能保證併發安全,因此需要改一下;
思路:使用 J.U.C中的 AtomicInteger 實現計數器
二、實現
public class CounterAtomic implements Counter { // JUC包 針對基本資料型別 --- 原子操作 AtomicInteger i = new AtomicInteger(0); // 本質是修改記憶體中某一個變數的值 public int incr() { return i.incrementAndGet(); } public int decr() { return i.decrementAndGet(); } @Override public int get() { return i.get(); } }
測試程式碼
public static void main(String[] args) throws InterruptedException { final Counter ct = new CounterAtomic(); //模擬多執行緒場景 CountDownLatch countDownLatch = new CountDownLatch(2); for (int i = 0; i < 2; i++) { new Thread(() -> { long begin = System.nanoTime(); for (int j = 0; j < 10000; j++) { ct.incr(); } System.out.println("done...運算時間: " + (System.nanoTime() - begin)); countDownLatch.countDown(); }).start(); } countDownLatch.await(); System.out.println("計數器最終結果: " + ct.get()); // 預期結果應該 --- 20000 }
列印結果, 符合預期
done...運算時間: 1067600
done...運算時間: 2265100
計數器最終結果: 20000