<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 瘋狂 閱讀(9621) 評論(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 冰上王國
    你這測試用例沒有涉及到多線程,怎么好比較兩者的差別?

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


    網站導航:
     
    主站蜘蛛池模板: 四虎永久免费观看| 亚洲精品无码久久久久去q| 亚洲国产精品线在线观看| 久久亚洲中文无码咪咪爱| 中文字幕在线免费| 亚洲狠狠爱综合影院婷婷| 亚洲中文无码a∨在线观看| www免费插插视频| 暖暖日本免费在线视频| 亚洲网站在线播放| 三年片免费高清版| 成人永久免费福利视频网站| 久久青青草原亚洲av无码app| 一区二区三区免费视频播放器| 四虎www免费人成| 亚洲欧洲日产专区| 可以免费观看的国产视频| 四虎影在线永久免费四虎地址8848aa | 久久久久久亚洲Av无码精品专口| 一级视频免费观看| 日韩免费视频播放| 亚洲18在线天美| 97精品免费视频| 亚洲第一AAAAA片| h视频在线免费观看| 日本二区免费一片黄2019| 亚洲中文久久精品无码1 | h视频在线免费看| 久久91亚洲精品中文字幕| a一级爱做片免费| 亚洲第一页综合图片自拍| 亚洲AV无码精品国产成人| 一区二区无码免费视频网站 | 亚洲国产高清精品线久久| 亚洲精品无码永久在线观看男男 | 国产亚洲无线码一区二区| 一级毛片免费在线| www.亚洲精品.com| 国产精品亚洲精品日韩电影| 精品少妇人妻AV免费久久洗澡| 亚洲 日韩 色 图网站|