<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)航:
     
    主站蜘蛛池模板: 亚洲人成图片小说网站| 可以免费观看一级毛片黄a| 婷婷久久久亚洲欧洲日产国码AV| 美女视频黄频a免费观看| 又大又粗又爽a级毛片免费看| 亚洲欧洲国产综合AV无码久久| 大地资源二在线观看免费高清| 亚洲Av高清一区二区三区| 大地资源免费更新在线播放| 伊人久久五月丁香综合中文亚洲| 成人无遮挡毛片免费看| 亚洲成a人片在线不卡一二三区 | 最近2018中文字幕免费视频| 777亚洲精品乱码久久久久久| 99热这里只有精品免费播放| 亚洲另类视频在线观看| 日韩在线a视频免费播放| 天堂亚洲免费视频| 亚洲AV无码乱码国产麻豆穿越| 永久在线观看www免费视频| 亚洲一区二区观看播放| 免费a级毛片大学生免费观看| 一级日本高清视频免费观看| 亚洲AV一宅男色影视| 免费人成在线观看69式小视频| 亚洲人精品亚洲人成在线| 四虎影视永久免费观看地址| 久久福利青草精品资源站免费| 亚洲日本乱码一区二区在线二产线 | 免费影院未满十八勿进网站| 亚洲av色香蕉一区二区三区| 亚洲最大AV网站在线观看| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲综合小说另类图片动图| AV在线播放日韩亚洲欧| 四虎精品视频在线永久免费观看| 亚洲av成人一区二区三区观看在线| 在线精品亚洲一区二区三区| 在线观看视频免费完整版| 国产JIZZ中国JIZZ免费看| 亚洲午夜精品在线|