瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          AtomicInteger

          Posted on 2011-10-17 10:53 瘋狂 閱讀(9619) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): concurrent

          AtomicInteger,一個(gè)提供原子操作的Integer的類(lèi)。在Java語(yǔ)言中,++i和i++操作并不是線程安全的,在使用的時(shí)候,不可避免的會(huì)用到synchronized關(guān)鍵字。而AtomicInteger則通過(guò)一種線程安全的加減操作接口。

          來(lái)看AtomicInteger提供的接口。

          //獲取當(dāng)前的值

          public final int get()

          //取當(dāng)前的值,并設(shè)置新的值

           public final int getAndSet(int newValue)

          //獲取當(dāng)前的值,并自增

           public final int getAndIncrement()

          //獲取當(dāng)前的值,并自減

          public final int getAndDecrement()

          //獲取當(dāng)前的值,并加上預(yù)期的值

          public final int getAndAdd(int delta)

          ... ...

          我們?cè)谏弦还?jié)提到的CAS主要是這兩個(gè)方法

              public final boolean compareAndSet(int expect, int update) {
              return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
              }

              public final boolean weakCompareAndSet(int expect, int update) {
              return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
              }

          這兩個(gè)方法是名稱不同,但是做的事是一樣的,可能在后續(xù)的java版本里面會(huì)顯示出區(qū)別來(lái)。

          詳細(xì)查看會(huì)發(fā)現(xiàn),這兩個(gè)接口都是調(diào)用一個(gè)unsafe的類(lèi)來(lái)操作,這個(gè)是通過(guò)JNI實(shí)現(xiàn)的本地方法,細(xì)節(jié)就不考慮了。

           

          下面是一個(gè)對(duì)比測(cè)試,我們寫(xiě)一個(gè)synchronized的方法和一個(gè)AtomicInteger的方法來(lái)進(jìn)行測(cè)試,直觀的感受下性能上的差異

           

           
          1. package zl.study.concurrency;  
          2. import java.util.concurrent.atomic.AtomicInteger;  
          3. public class AtomicIntegerCompareTest {  
          4.     private int value;  
          5.       
          6.     public AtomicIntegerCompareTest(int value){  
          7.         this.value = value;  
          8.     }  
          9.       
          10.     public synchronized int increase(){  
          11.         return value++;  
          12.     }  
          13.       
          14.     public static void main(String args[]){  
          15.         long start = System.currentTimeMillis();  
          16.           
          17.         AtomicIntegerCompareTest test = new AtomicIntegerCompareTest(0);  
          18.         forint i=0;i< 1000000;i++){  
          19.             test.increase();  
          20.         }  
          21.         long end = System.currentTimeMillis();  
          22.         System.out.println("time elapse:"+(end -start));  
          23.           
          24.         long start1 = System.currentTimeMillis();  
          25.           
          26.         AtomicInteger atomic = new AtomicInteger(0);  
          27.           
          28.         forint i=0;i< 1000000;i++){  
          29.             atomic.incrementAndGet();  
          30.         }  
          31.         long end1 = System.currentTimeMillis();  
          32.         System.out.println("time elapse:"+(end1 -start1) );  
          33.           
          34.           
          35.     }  
          36. }  

           

          結(jié)果

          time elapse:31
          time elapse:16
          由此不難看出,通過(guò)JNI本地的CAS性能遠(yuǎn)超synchronized關(guān)鍵字

           

          Reference

          http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar


          評(píng)論

          # re: AtomicInteger  回復(fù)  更多評(píng)論   

          2012-04-23 15:35 by IT民工學(xué)習(xí)網(wǎng)網(wǎng)
          http://www.easy518.com

          # re: AtomicInteger  回復(fù)  更多評(píng)論   

          2013-10-14 15:30 by 冰上王國(guó)
          你這測(cè)試用例沒(méi)有涉及到多線程,怎么好比較兩者的差別?

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新安县| 友谊县| 高阳县| 茂名市| 南安市| 巴林右旗| 蒲江县| 龙门县| 白山市| 阿拉尔市| 九寨沟县| 当涂县| 新沂市| 南丰县| 防城港市| 阿拉尔市| 阜新市| 乌兰县| 昭觉县| 高台县| 拉孜县| 九龙县| 隆子县| 宁明县| 西充县| 台东市| 常宁市| 大安市| 通道| 赤壁市| 武定县| 凌海市| 广水市| 勐海县| 博野县| 安平县| 东安县| 丰都县| 玉龙| 霍林郭勒市| 湘潭县|