Go語(yǔ)言并發(fā)安全

go語(yǔ)言最重要的特點(diǎn)就是原生支持并發(fā)————goroutine也物。而用到并發(fā)宫屠,就不得不考慮數(shù)據(jù)安全的問(wèn)題列疗。Go語(yǔ)言里有兩種方式實(shí)現(xiàn)并發(fā)安全。

以下是go官網(wǎng)上對(duì)于內(nèi)存模型的建議:

Advice
Programs that modify data being simultaneously accessed by multiple goroutines must serialize such access.
To serialize access, protect the data with channel operations or other synchronization primitives such as those in the sync and sync/atomic packages.
If you must read the rest of this document to understand the behavior of your program, you are being too clever. Don’t be clever.

1. sync/atomic

sync/atomic包提供了底層的原子級(jí)內(nèi)存操作抵栈。該包的函數(shù)分為四個(gè)系列: Load,Store古劲,Add斥赋,Swap产艾,CompareAndSwap,分別用來(lái)進(jìn)行整形變量的加載闷堡,保存,加減杠览,交換和比較交換操作弯菊。
這些函數(shù)必須謹(jǐn)慎地保證正確使用踱阿。除了某些特殊的底層應(yīng)用钦铁,使用通道或者sync包的函數(shù)/類型實(shí)現(xiàn)同步更好才漆。

2. sync
2.1 什么情況下要使用鎖

當(dāng)可能存在以下情況:同時(shí)有多個(gè)線程訪問(wèn)同一段內(nèi)存牛曹,且其中至少有一個(gè)線程的操作是寫操作栽烂。
滿足以上條件,就應(yīng)該果斷加鎖腺办。加鎖的操作是幾十納秒級(jí)別的,開銷基本可以忽略书妻。而如果沒(méi)有加鎖導(dǎo)致數(shù)據(jù)不一致甚至crash,損失就大了躲履。以上條件對(duì)使用atomic包依然成立聊闯。

2.2 example

sync包的鎖包括互斥鎖和讀寫互斥鎖。
簡(jiǎn)單寫了一個(gè)讀寫互斥鎖的例子菱蔬,需要注意的是,不僅寫的時(shí)候要加鎖(或使用atomic操作)拴泌,讀的時(shí)候也要加鎖(或使用atomic操作)。

type smtx struct {
    lock  sync.RWMutex
    data  string
}

var s smtx

func write() {
    s.Lock()
    defer s.Unlock()
    s.data += "a"

}

func read() {
    s.RLock()
    defer s.RUnlock()
    fmt.Println(s.data)
}

3. channel

Go語(yǔ)言有一句流行的黑話:不要通過(guò)共享內(nèi)存進(jìn)行通信, 通過(guò)通信共享內(nèi)存 (Don't communicate by sharing memory, insted share memory by communicating)箭昵。通過(guò)通信來(lái)共享內(nèi)存回季,可以更大程度的解耦代碼,提高代碼的可讀性和可維護(hù)性泡一。雖然增加了一點(diǎn)內(nèi)存開銷颤殴,但是大大降低編程復(fù)雜度。
說(shuō)一句題外話瘾杭,微服務(wù)架構(gòu),也是利用消息隊(duì)列來(lái)實(shí)現(xiàn)模塊之間的解偶贤笆。和這句話有相通之處。
channel本質(zhì)上就是通過(guò)內(nèi)存隊(duì)列芥永,一次性只處理一個(gè)消息,從而實(shí)現(xiàn)了訪問(wèn)的序列化板辽,避免了數(shù)據(jù)競(jìng)爭(zhēng)(data race)棘催。

很多時(shí)候劲弦,編譯器會(huì)做一些神奇的優(yōu)化醇坝,導(dǎo)致意想不到的數(shù)據(jù)沖突,所以画畅,只要滿足“同時(shí)有多個(gè)線程訪問(wèn)同一段內(nèi)存宋距,且其中至少有一個(gè)線程的操作是寫操作”這一條件,就需要作并發(fā)安全方面的處理谚赎。
最后,推薦一篇關(guān)于數(shù)據(jù)競(jìng)爭(zhēng)文章, 說(shuō)明了沸版,即使在所謂良性數(shù)據(jù)競(jìng)爭(zhēng)兴蒸,也可能出問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕾殴,一起剝皮案震驚了整個(gè)濱河市岛啸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坚踩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批幌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荧缘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門信姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绸罗,“玉大人,你說(shuō)我怎么就攤上這事珊蟀。” “怎么了俊性?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵描扯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绽诚,道長(zhǎng),這世上最難降的妖魔是什么卒落? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任蜂桶,我火速辦了婚禮,結(jié)果婚禮上扑媚,老公的妹妹穿的比我還像新娘。我一直安慰自己费坊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布附井。 她就那樣靜靜地躺著,像睡著了一般谎痢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上节猿,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天漫雕,我揣著相機(jī)與錄音,去河邊找鬼浸间。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囊扳,可吹牛的內(nèi)容都是我干的兜看。 我是一名探鬼主播锥咸,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搏予,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雪侥?” 一聲冷哼從身側(cè)響起精绎,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旬牲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體引谜,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擎浴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年毒涧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滑频,死狀恐怖唤冈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情你虹,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布夯辖,位于F島的核電站董饰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卒暂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一谴供、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桂肌,春花似錦永淌、人聲如沸崎场。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螃宙。三九已至所坯,卻和暖如春谆扎,著一層夾襖步出監(jiān)牢的瞬間芹助,已是汗流浹背闲先。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工无蜂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斥季。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像渊迁,于是被迫代替她去往敵國(guó)和親灶挟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琉朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 出處---Go編程語(yǔ)言 歡迎來(lái)到 Go 編程語(yǔ)言指南箱叁。本指南涵蓋了該語(yǔ)言的大部分重要特性 Go 語(yǔ)言的交互式簡(jiǎn)介惕医,...
    Tuberose閱讀 18,426評(píng)論 1 46
  • Hello World這是開發(fā)的一個(gè)開發(fā)魔咒,幾乎所有人都是從這開始的抬伺,今天我也從魔咒開始先打印一份Hello W...
    cocoaAhda閱讀 1,442評(píng)論 0 3
  • 1.安裝 https://studygolang.com/dl 2.使用vscode編輯器安裝go插件 3.go語(yǔ)...
    go含羞草閱讀 1,553評(píng)論 0 6
  • 隨著現(xiàn)在文化的不斷發(fā)展峡钓,戒指也被人們賦予了很多不同的含義。戒指不同的佩戴方法能岩,所蘊(yùn)含的意義也是不同的±椋可以說(shuō)戒指在...
    珠寶大課堂閱讀 910評(píng)論 0 0
  • 1 楠生遇見之應(yīng)的時(shí)候他跟蘇沁已經(jīng)同居了一年,可他仍不能自己愛上了之應(yīng)钥屈。 明知道最好別見面,可他和之應(yīng)在一塊就什么...
    紫蘇卡卡閱讀 497評(píng)論 1 5