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。
說明:
- m++並不是一個原子操作,而incrementAndGet卻是原子操作方法
