Java原子操作AtomicInteger的用法

原文地址:http://www.reibang.com/p/509aca840f6d

前言:

JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子處理類三痰。AtomicBoolean吧寺、AtomicInteger、AtomicLong散劫、AtomicReference稚机。主要用于在高并發(fā)環(huán)境下的高效程序處理,來幫助我們簡化同步處理.

AtomicInteger:

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

我們先來看看AtomicInteger給我們提供了什么接口:

public final int get() //獲取當(dāng)前的值
public final int getAndSet(int newValue)//獲取當(dāng)前的值,并設(shè)置新的值
public final int getAndIncrement()//獲取當(dāng)前的值仿贬,并自增
public final int getAndDecrement() //獲取當(dāng)前的值纽竣,并自減
public final int getAndAdd(int delta) //獲取當(dāng)前的值,并加上預(yù)期的值

下面通過兩個簡單的例子來看一下 AtomicInteger 的優(yōu)勢在哪:
普通線程同步:

class Test2 {        
  private volatile int count = 0;         
  
  public synchronized void increment() {                  
    count++; //若要線程安全執(zhí)行執(zhí)行count++茧泪,需要加鎖       
  }         

  public int getCount() { 
    return count;        
  }
}

使用AtomicInteger:

class Test2 {
    private AtomicInteger count = new AtomicInteger();

    public void increment() {
        count.incrementAndGet();
    }   //使用AtomicInteger之后蜓氨,不需要加鎖,也可以實現(xiàn)線程安全调炬。       

    public int getCount() {
        return count.get();
    }
}

從上面的例子中我們可以看出:使用AtomicInteger是非常的安全的.而且因為AtomicInteger由硬件提供原子操作指令實現(xiàn)的语盈。在非激烈競爭的情況下舱馅,開銷更小缰泡,速度更快。

我們來看看AtomicInteger是如何使用非阻塞算法來實現(xiàn)并發(fā)控制的:
AtomicInteger的關(guān)鍵域只有一下3個:

// setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) {
            throw new Error(ex);
        }
    }

    private volatile int value;

這里代嗤, unsafe是java提供的獲得對對象內(nèi)存地址訪問的類棘钞,注釋已經(jīng)清楚的寫出了,它的作用就是在更新操作時提供“比較并替換”的作用干毅。實際上就是AtomicInteger中的一個工具宜猜。
valueOffset是用來記錄value本身在內(nèi)存的便宜地址的,這個記錄硝逢,也主要是為了在更新操作在內(nèi)存中找到value的位置姨拥,方便比較。
注意:value是用來存儲整數(shù)的時間變量渠鸽,這里被聲明為volatile叫乌,就是為了保證在更新操作時,當(dāng)前線程可以拿到value最新的值(并發(fā)環(huán)境下徽缚,value可能已經(jīng)被其他線程更新了)憨奸。
這里,我們以自增的代碼為例凿试,可以看到這個并發(fā)控制的核心算法:

/**
     * Atomicallyincrementsbyonethecurrentvalue.
     *
     * @returntheupdatedvalue
     */
    public final int incrementAndGet() {
        for (; ; ) {
            //這里可以拿到value的最新值
            intcurrent = get();
            intnext = current + 1;
            if (compareAndSet(current, next))
                returnnext;
        }
    }

    public final boolean compareAndSet(intexpect, intupdate) {
        //使用unsafe的native方法排宰,實現(xiàn)高效的硬件級別CAS
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

優(yōu)點總結(jié):
最大的好處就是可以避免多線程的優(yōu)先級倒置和死鎖情況的發(fā)生,提升在高并發(fā)處理下的性能那婉。

擴(kuò)展鏈接:http://www.ibm.com/developerworks/cn/java/j-jtp11234/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末板甘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子详炬,更是在濱河造成了極大的恐慌盐类,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傲醉,居然都是意外死亡蝇闭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門硬毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻引,“玉大人,你說我怎么就攤上這事吐咳÷哂疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵韭脊,是天一觀的道長童谒。 經(jīng)常有香客問我,道長沪羔,這世上最難降的妖魔是什么饥伊? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔫饰,結(jié)果婚禮上琅豆,老公的妹妹穿的比我還像新娘。我一直安慰自己篓吁,他們只是感情好茫因,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杖剪,像睡著了一般冻押。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盛嘿,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天洛巢,我揣著相機(jī)與錄音,去河邊找鬼孩擂。 笑死狼渊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的类垦。 我是一名探鬼主播狈邑,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚤认!你這毒婦竟也來了米苹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砰琢,失蹤者是張志新(化名)和其女友劉穎蘸嘶,沒想到半個月后良瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡训唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年褥蚯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片况增。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赞庶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澳骤,到底是詐尸還是另有隱情歧强,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布为肮,位于F島的核電站摊册,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颊艳。R本人自食惡果不足惜茅特,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望籽暇。 院中可真熱鬧温治,春花似錦、人聲如沸戒悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绸狐。三九已至,卻和暖如春累盗,著一層夾襖步出監(jiān)牢的瞬間寒矿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工若债, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留符相,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓蠢琳,卻偏偏與公主長得像啊终,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傲须,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容