[Java]初識AtomicInteger

來源:互聯網
上載者:User

標籤:

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的效能貌似比前者更快!有興趣的可以自己比較一下看看。

嗯。

最後,感謝以下博文的鼎立奉獻,感謝百度祖師爺的全力協助

  1. http://my.oschina.net/i33/blog/50503
  2. http://blog.csdn.net/zz198808/article/details/8029405


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

[Java]初識AtomicInteger

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.