<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

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

    AtomicInteger

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

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

    來看AtomicInteger提供的接口。

    //獲取當前的值

    public final int get()

    //取當前的值,并設置新的值

     public final int getAndSet(int newValue)

    //獲取當前的值,并自增

     public final int getAndIncrement()

    //獲取當前的值,并自減

    public final int getAndDecrement()

    //獲取當前的值,并加上預期的值

    public final int getAndAdd(int delta)

    ... ...

    我們在上一節提到的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);
        }

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

    詳細查看會發現,這兩個接口都是調用一個unsafe的類來操作,這個是通過JNI實現的本地方法,細節就不考慮了。

     

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

     

     
    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. }  

     

    結果

    time elapse:31
    time elapse:16
    由此不難看出,通過JNI本地的CAS性能遠超synchronized關鍵字

     

    Reference

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


    評論

    # re: AtomicInteger  回復  更多評論   

    2012-04-23 15:35 by IT民工學習網網
    http://www.easy518.com

    # re: AtomicInteger  回復  更多評論   

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

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


    網站導航:
     
    主站蜘蛛池模板: 影音先锋在线免费观看| 免费在线观影网站| 免费精品国产自产拍在| 亚洲AV无一区二区三区久久| aa级毛片毛片免费观看久| 亚洲中文字幕无码一区二区三区| 久久成人18免费网站| 亚洲精品夜夜夜妓女网| 久久久久久国产精品免费免费男同| 亚洲AV无码精品色午夜果冻不卡| 水蜜桃视频在线观看免费播放高清| 国产美女亚洲精品久久久综合| a级毛片免费全部播放无码| 亚洲va久久久噜噜噜久久狠狠| 一区二区三区四区免费视频| 亚洲精品午夜在线观看| 成年人在线免费看视频| 免费无码一区二区| 久久久久久久综合日本亚洲| 亚洲毛片免费视频| 亚洲人成网亚洲欧洲无码| 国产一级高清视频免费看| 中美日韩在线网免费毛片视频| 亚洲av无码专区在线播放| 色片在线免费观看| 欧洲亚洲综合一区二区三区| 亚洲一区二区三区无码中文字幕 | 午夜国产羞羞视频免费网站| 一级毛片一级毛片免费毛片| 亚洲国产精品嫩草影院在线观看 | 精品亚洲A∨无码一区二区三区| 99在线精品视频观看免费| 偷自拍亚洲视频在线观看99| 国产亚洲一区二区三区在线观看| 中文字幕免费在线观看| 亚洲AV无码一区二区大桥未久| 亚洲精品午夜无码电影网| 成人免费男女视频网站慢动作| 黄色网址免费在线观看| 亚洲av无码片在线观看| 亚洲精品WWW久久久久久|