Go sync/atomic包Load和Store并發(fā)不安全


前言:為了保證并發(fā)安全,go語言中可以使用原子操作黍特。其執(zhí)行過程不能被中斷触创,這也就保證了同一時刻一個線程的執(zhí)行不會被其他線程中斷,也保證了多線程下數(shù)據(jù)操作的一致性候醒。

1.sync/atomic包
2.Load和Store并發(fā)不安全

1.sync/atomic包

在atomic包中對幾種基礎(chǔ)類型提供了原子操作能颁,包括int32,int64倒淫,uint32伙菊,uint64,uintptr敌土,unsafe.Pointer镜硕。
對于每一種類型,提供了五類原子操作分別是

  • Add, 增加和減少
  • CompareAndSwap, 比較并交換
  • Swap, 交換
  • Load , 讀取
  • Store, 存儲

2.Load和Store并發(fā)不安全

Load和Store操作對應(yīng)與變量的原子性讀寫返干,許多變量的讀寫無法在一個時鐘周期內(nèi)完成谦疾,而此時執(zhí)行可能會被調(diào)度到其他線程,無法保證并發(fā)安全犬金。
??Load 只保證讀取的不是正在寫入的值念恍,Store只保證寫入是原子操作六剥。
所以在使用的時候要注意。
下面簡單示例:

package main

import (
    "sync"
    "sync/atomic"
    "fmt"
)

var (
    wg  sync.WaitGroup
    mu  sync.Mutex
    num int32
)

func wrap(callback func()) {
    wg.Add(1)
    go func() {
        callback()
        wg.Done()
    }()
}

// go build -race
func main() {
    // 1099 峰伙、892, 并發(fā)不安全
    //wrap(incNumAtomic)
    //wrap(incNumAtomic)

    // 1200, 并發(fā)安全
    wrap(incNumAtomic2)
    wrap(incNumAtomic2)

    wg.Wait()
    fmt.Printf("num=%d\n", num)
}

func incNumAtomic() {
    for i := 0; i < 600; i++ {
        // atomic.Load*系列函數(shù)只能保證讀取的不是正在寫入的值(比如只被修改了一半的數(shù)據(jù))
        // 同樣的atomic.Store* 只保證寫入是原子操作(保證寫入操作的完整性)
        val := atomic.LoadInt32(&num)
        atomic.StoreInt32(&num, val+1)
    }
}

func incNumAtomic2() {
    for i := 0; i < 600; i++ {
        atomic.AddInt32(&num, 1)
    }
}

總結(jié)

點擊??查看源碼疗疟,哈哈哈...

Github Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瞳氓,隨后出現(xiàn)的幾起案子策彤,更是在濱河造成了極大的恐慌,老刑警劉巖匣摘,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件店诗,死亡現(xiàn)場離奇詭異,居然都是意外死亡音榜,警方通過查閱死者的電腦和手機(jī)庞瘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赠叼,“玉大人擦囊,你說我怎么就攤上這事∽彀欤” “怎么了瞬场?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涧郊。 經(jīng)常有香客問我贯被,道長,這世上最難降的妖魔是什么妆艘? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任彤灶,我火速辦了婚禮,結(jié)果婚禮上双仍,老公的妹妹穿的比我還像新娘。我一直安慰自己桌吃,他們只是感情好朱沃,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茅诱,像睡著了一般逗物。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑟俭,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天翎卓,我揣著相機(jī)與錄音,去河邊找鬼摆寄。 笑死失暴,一個胖子當(dāng)著我的面吹牛坯门,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逗扒,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼古戴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矩肩?” 一聲冷哼從身側(cè)響起现恼,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黍檩,沒想到半個月后叉袍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡刽酱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年喳逛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛跌。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡艺配,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衍慎,到底是詐尸還是另有隱情转唉,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布稳捆,位于F島的核電站赠法,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乔夯。R本人自食惡果不足惜砖织,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望末荐。 院中可真熱鬧侧纯,春花似錦、人聲如沸甲脏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽块请。三九已至娜氏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墩新,已是汗流浹背贸弥。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留海渊,地道東北人绵疲。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓哲鸳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親最岗。 傳聞我的和親對象是個殘疾皇子帕胆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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