Java原子操作類AtomicInteger應用場景


Java中有那么一些類,是以Atomic開頭的。這一系列的類我們稱之為原子操作類。以最簡單的類AtomicInteger為例。它相當於一個int變量,我們執行Int的 i++ 的時候並不是一個原子操作。而使用AtomicInteger的incrementAndGet卻能保證原子操作。具體的類如下:

閑話不多說,還是用實例說話吧。

問題:現在有2個線程,分別將全局整型變量 i 進行加1。每個線程執行5000次。按照傳統的int使用方式,代碼如下:

private static int m = 0;

public static void main(String[] args) throws InterruptedException {
    CountDownLatch cdl = new CountDownLatch(2);

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int j = 0; j < 5000; j++) {
                m++;
            }
            cdl.countDown();
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int j = 0; j < 5000; j++) {
                m++;
            }
            cdl.countDown();
        }
    });
    t1.start();
    t2.start();

    cdl.await();
    System.out.println("result=" + m);
}

最后我們執行上面的代碼,結果有可能是10000,但是大多數時候不是10000,而是隨機的一些數字。這里的問題就在於 m++,如果我們在 m++的時候加上關鍵字synchronized也能解決該並發問題。但是synchronized過於沉重。於是我們可以考慮使用原子操作類AtomicInteger來實現。具體實現代碼如下:

public static void main(String[] args) throws InterruptedException {
    CountDownLatch cdl = new CountDownLatch(2);
    AtomicInteger i = new AtomicInteger(0);

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int j = 0; j < 5000; j++) {
                i.incrementAndGet();
            }
            cdl.countDown();
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int j = 0; j < 5000; j++) {
                i.incrementAndGet();
            }
            cdl.countDown();
        }
    });
    t1.start();
    t2.start();

    cdl.await();
    System.out.println("result=" + i.get());
}

現在我們無論執行多少次,結果總是10000。

說明:

  1. m++並不是一個原子操作,而incrementAndGet卻是原子操作方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM