標籤:
AtomicInteger,這是java提供的一個原子操作Integer的類,這在我眼裡還是一個稀客,可能是不怎麼感興趣,以至於一直當作簡單的volatile,這也是我的拙見。其實這傢伙還是挺好用的,在常見的情境中,如count++或++count,這在java多線程的使用中是不安全的,而AtomicInteger屬於原子操作(安全執行緒),可以在下面的例子中看出來。
package org.jan.java.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;/** * 關於count++在多線程調用情況下 * * @author jan */public class Counter {private volatile int count = 0;/** * 為了保證資料的準確性,多線程的情況下需要加上synchronized關鍵字</br> * 否則會出現出乎預料的結果 這也是安全執行緒的重要體現 */public void increment() {count++;}private int getCount() {return count;}/** * 這裡類比一個遞增的任務,遞增目標為100W */public static void main(String[] args) throws InterruptedException { final Counter counter = new Counter();//final AtomicCounter counter = new AtomicCounter();int workCount = 1000000;ExecutorService executor = Executors.newFixedThreadPool(10);long start = System.currentTimeMillis();for (int i = 0; i < workCount; i++) {Runnable runnable = new Runnable() {@Overridepublic void run() {counter.increment();}};executor.execute(runnable);}// 關閉啟動線程,執行未完成的任務executor.shutdown();// 等待所有線程完成任務,完成後才繼續執行下一步executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");System.out.println("執行結果:count=" + counter.getCount());}}
它的結果不是我們預料的100 0000 .通常我們需要加上在count++時 加上synchronized關鍵字,保證他的正確性。
如果我們換個方式,用AtomicInteger來替換count++,怎麼做呢?
public class AtomicCounter {private AtomicInteger count = new AtomicInteger(0);// 使用AtomicInteger之後,不需要加鎖,也可以實現安全執行緒。public void increment() {//擷取當前的值並自增count.incrementAndGet();}/** * 擷取當前的值 * @return */public int getCount() {return count.get();}//遞減public void deIncrement(){count.decrementAndGet();}}
把最開始的代碼裡的Counter對象換成我們的AtomicCounter類的對象,試試他的方法,我們發現,結果就保證了100W!
AtomicInteger 還有其他的一些方法,查一下Api就行了。而且也不是說只有Integer有這麼個原子操作的類,這裡不是重點,有興趣就自己百度去吧。
//擷取當前的值publicfinal int get()//取當前的值,並設定新的值 publicfinal int getAndSet(intnewValue)//擷取當前的值,並自增 publicfinal int getAndIncrement()//擷取當前的值,並自減publicfinal int getAndDecrement()//擷取當前的值,並加上預期的值 publicfinal int getAndAdd(intdelta)
你說他就這麼一個特點,並不是很吸引人?
他的效能貌似也挺給力的,就如最開始的那個代碼把,我看了一下啊,在count++ 方法加上synchronized欄位後與 atomicInteger的increment方法相比較,atomicInteger的效能貌似比前者更快!有興趣的可以自己比較一下看看。
嗯。
最後,感謝以下博文的鼎立奉獻,感謝百度祖師爺的全力協助
- http://my.oschina.net/i33/blog/50503
- http://blog.csdn.net/zz198808/article/details/8029405
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[Java]初識AtomicInteger