瘋狂

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

          AtomicInteger

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

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

          來看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)

          ... ...

          我們在上一節(jié)提到的CAS主要是這兩個方法

              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);
              }

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

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

           

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

           

           
          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
          由此不難看出,通過JNI本地的CAS性能遠(yuǎn)超synchronized關(guān)鍵字

           

          Reference

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


          評論

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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 三门峡市| 新田县| 南投县| 平阳县| 江都市| 泽普县| 武定县| 古蔺县| 阿克陶县| 会同县| 长沙市| 望江县| 涟源市| 普宁市| 方城县| 京山县| 栖霞市| 东乡县| 云梦县| 安徽省| 定兴县| 渭源县| 九寨沟县| 双牌县| 杭锦后旗| 巧家县| 沾化县| 大田县| 刚察县| 东莞市| 博湖县| 新田县| 牙克石市| 新蔡县| 色达县| 民勤县| 嘉荫县| 宾阳县| 贵州省| 顺义区| 通州区|