<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    AtomicInteger

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

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

    來看AtomicInteger提供的接口。

    //獲取當前的值

    public final int get()

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

     public final int getAndSet(int newValue)

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

     public final int getAndIncrement()

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

    public final int getAndDecrement()

    //獲取當前的值,并加上預(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ū)別來。

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

     

    下面是一個對比測試,我們寫一個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. }  

     

    結(jié)果

    time elapse:31
    time elapse:16
    由此不難看出,通過JNI本地的CAS性能遠超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)航:
     
    主站蜘蛛池模板: 伊人亚洲综合青草青草久热| 中文字幕久无码免费久久| 久久久久高潮毛片免费全部播放| 特级无码毛片免费视频尤物| 久久国产亚洲观看| 在线看片免费人成视频久网下载| 国产亚洲精品资在线| 国产区在线免费观看| 亚洲中久无码永久在线观看同| 三年片免费高清版 | 你懂的免费在线观看网站| 国产亚洲人成网站观看| 久久国产精品免费专区| 亚洲人成在线播放| 免费观看的毛片手机视频| 国产亚洲精品免费| 免费萌白酱国产一区二区| 五月天国产成人AV免费观看| 亚洲色偷拍区另类无码专区| 四虎国产精品永久免费网址| 337p日本欧洲亚洲大胆艺术| 大学生a级毛片免费观看| 添bbb免费观看高清视频| 国产亚洲精AA在线观看SEE| **俄罗斯毛片免费| 亚洲av无一区二区三区| 国产亚洲精品成人a v小说| 日本免费网站视频www区| 久久亚洲色WWW成人欧美| 亚洲午夜久久久久妓女影院 | 67pao强力打造国产免费| 亚洲人成色在线观看| 精品亚洲一区二区三区在线观看| 久久免费国产精品一区二区| 亚洲 欧洲 视频 伦小说| 精品国产日韩亚洲一区| 天天影视色香欲综合免费| 国产精品亚洲精品日韩动图| 久久精品国产亚洲| 国产精品免费看久久久久| 久久亚洲免费视频|