1. 程式人生 > 實用技巧 >多執行緒併發安全計數器實現限流(二) 使用 J.U.C中的AtomicInteger實現計數器

多執行緒併發安全計數器實現限流(二) 使用 J.U.C中的AtomicInteger實現計數器

一、使用 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