java atomic

java atomic

原子變量提供各種原子操作陶耍,多線程場(chǎng)景下操作不需要加鎖畜晰,性能非常好

簡例

AtomicInteger ai = new AtomicInteger(10);
ExecutorService es = Executors.newCachedThreadPool();

long endTime = System.currentTimeMillis() + 100;
for (int i = 0; i < 10; i++) {
    es.execute(() -> {
        while (System.currentTimeMillis() < endTime) {
            System.out.println(ai.incrementAndGet());
            System.out.println(ai.addAndGet(1));
        }
    });
}

try {
    es.shutdown();
    while (!es.awaitTermination(1, TimeUnit.SECONDS)) {
        // nothing to do
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

AtomicInteger

  • get: 返回當(dāng)前 int 值
  • incrementAndGet: 自增筐骇,返回自增后的值
  • getAndIncrement: 自增敌蜂,發(fā)揮自增前的值
  • addAndGet: 加上一個(gè) int拾枣,并且獲取加上之后的值
  • getAndAdd: 加上一個(gè) int庆械,并且返回加上之前的值
  • compareAndSet: 當(dāng)前值與參數(shù)相等時(shí)薇溃,才設(shè)置當(dāng)前值,返回是否設(shè)置成功
  • compareAndExchange: 當(dāng)前值與參數(shù)相等時(shí)缭乘,才設(shè)置當(dāng)前值沐序,返回老的值
AtomicInteger i = new AtomicInteger(10);
assertEquals(i.get(), 10);
assertEquals(i.incrementAndGet(), 11);
assertEquals(i.getAndIncrement(), 11);
assertEquals(i.get(), 12);
assertEquals(i.addAndGet(10), 22);
assertEquals(i.getAndAdd(10), 22);
assertEquals(i.get(), 32);
assertTrue(i.compareAndSet(32, 10));
assertFalse(i.compareAndSet(32, 10));
assertEquals(i.compareAndExchange(10, 22), 10);
assertEquals(i.compareAndExchange(10, 22), 22);

AtomicIntegerArray

AtomicInteger 的接口類似,只是每個(gè)接口都增加一個(gè) index 參數(shù)

AtomicIntegerArray ia = new AtomicIntegerArray(10);

for (int i = 0; i < 10; i++) {
    ia.set(i, i);
}

assertEquals(ia.get(5), 5);
assertEquals(ia.incrementAndGet(5), 6);
assertEquals(ia.incrementAndGet(5), 7);
assertEquals(ia.addAndGet(5, 10), 17);
assertTrue(ia.compareAndSet(5, 17, 15));
assertEquals(ia.compareAndExchange(5, 15, 10), 15); // 返回老值

AtomicReference

  • get: 獲取當(dāng)前引用對(duì)象
  • getAndSet: 設(shè)置新的引用忿峻,并返回老的引用
  • compareAndSet: 當(dāng)前值與參數(shù)相等時(shí)薄啥,才設(shè)置當(dāng)前值,返回是否設(shè)置成功
  • compareAndExchange: 當(dāng)前值與參數(shù)相等時(shí)逛尚,才設(shè)置當(dāng)前值垄惧,返回老的值
  • accumulateAndGet: 用當(dāng)前值和參數(shù)一起執(zhí)行 BinaryOpterator 的結(jié)果設(shè)置成當(dāng)前值,返回新的值
  • getAndAccumulate: 用當(dāng)前值和參數(shù)一起執(zhí)行 BinaryOpterator 的結(jié)果設(shè)置成當(dāng)前值绰寞,返回老的值
AtomicReference<Integer> i = new AtomicReference<>();
assertEquals(i.get(), null);
assertEquals(i.getAndSet(10), null);
assertEquals(i.get(), Integer.valueOf(10));
assertEquals(i.compareAndExchange(10, 11), Integer.valueOf(10));
assertTrue(i.compareAndSet(11, 12));
assertEquals(i.accumulateAndGet(3, (x, y) -> x + y), Integer.valueOf(15));
assertEquals(i.getAndAccumulate(3, (x, y) -> x + y), Integer.valueOf(15));

AtomicStampedReference

在 atomic 的基礎(chǔ)上增加一個(gè) stamp 概念到逊,stamp 可理解為一個(gè)版本號(hào),即使兩個(gè)相等值相等滤钱,還可以通過版本號(hào)來區(qū)分

AtomicStampedReference<Integer> i = new AtomicStampedReference<>(null, 0);
assertEquals(i.getReference(), null);
assertEquals(i.getStamp(), 0);
assertTrue(i.compareAndSet(null, 10, 0, 1));
assertEquals(i.getReference(), Integer.valueOf(10));
assertEquals(i.getStamp(), 1);

LongAccumulator

LongAccumulator 累加器觉壶,內(nèi)部采用多個(gè) atomic 變量實(shí)現(xiàn),減少由于多線程競爭帶來的性能開銷件缸,LongAccumulator 通過一個(gè) BinaryOperator 和一個(gè)初始值構(gòu)造而成铜靶,而 LongAddr 相當(dāng)于 new LongAccumulator((x, y) -> x + y, 0)

 {
    LongAccumulator i = new LongAccumulator((x, y) -> x + y, 0);
    i.accumulate(10);
    i.accumulate(20);
    assertEquals(i.get(), 30);
}
{
    LongAdder j = new LongAdder();
    j.add(10);
    j.add(20);
    assertEquals(j.sum(), 30);
}

鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市他炊,隨后出現(xiàn)的幾起案子争剿,更是在濱河造成了極大的恐慌,老刑警劉巖痊末,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚕苇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凿叠,警方通過查閱死者的電腦和手機(jī)涩笤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門嚼吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬碧,你說我怎么就攤上這事舱禽。” “怎么了锰茉?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵呢蔫,是天一觀的道長切心。 經(jīng)常有香客問我飒筑,道長,這世上最難降的妖魔是什么绽昏? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任协屡,我火速辦了婚禮,結(jié)果婚禮上全谤,老公的妹妹穿的比我還像新娘肤晓。我一直安慰自己,他們只是感情好认然,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布补憾。 她就那樣靜靜地躺著,像睡著了一般卷员。 火紅的嫁衣襯著肌膚如雪盈匾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天毕骡,我揣著相機(jī)與錄音削饵,去河邊找鬼。 笑死未巫,一個(gè)胖子當(dāng)著我的面吹牛窿撬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叙凡,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼劈伴,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了握爷?” 一聲冷哼從身側(cè)響起跛璧,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饼拍,沒想到半個(gè)月后赡模,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师抄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年漓柑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辆布,死狀恐怖瞬矩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锋玲,我是刑警寧澤景用,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站惭蹂,受9級(jí)特大地震影響伞插,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盾碗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一媚污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧廷雅,春花似錦耗美、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芥玉,卻和暖如春蛇摸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飞傀。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工皇型, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸烦。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓弃鸦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幢痘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唬格,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344