golang實(shí)現(xiàn)協(xié)程安全的幾種方式

  • 版本
    golang -- 1.12.4

  • golang協(xié)程同步

1.channel - monitor goroutine

var deposits = make(chan int) // send amount to deposit
var balances = make(chan int) // receive balance

func Deposit(amount int) { deposits <- amount }
func Balance() int       { return <-balances }

func teller() {
     var balance int // balance is confined to teller goroutine
     for {
         select {
         case amount := <-deposits:
              balance += amount
         case balances <- balance:
         }
      }
}
func init() {
     go teller() // start the monitor goroutine
}

2.channel - serial confinement

type Cake struct{ state string }

func baker(cooked chan<- *Cake) {
     for {
             cake := new(Cake)
             cake.state = "cooked"
             cooked <- cake // baker never touches this cake again
         } 
}

func icer(iced chan<- *Cake, cooked <-chan *Cake) {
      for cake := range cooked {
             cake.state = "iced"
             iced <- cake // icer never touches this cake again
      } 
}

3.mutual exclusion

import "sync"

var mu      sync.Mutex // guards balance
var balance int

func Deposit(amount int) {
         mu.Lock()
         balance = balance + amount
         mu.Unlock()
}

func Balance() int {
         mu.Lock()
         defer mu.Unlock()
         return balance
}

4.mutual exclusion - RWMutex

import "sync"

var mu      sync.RWMutex // guards balance
var balance int

func Deposit(amount int) {
         mu.Lock()
         balance = balance + amount
         mu.Unlock()
}

func Balance() int {
         mu.RLock() //readers lock
         defer mu.RUnlock()
         return balance
}

RLock允許讀取并行,寫入和讀取完全互斥,多次讀取,一次寫入

5.Lazy Initialization - sync.Once

var loadIconsOnce sync.Once
var icons map[string]image.Image
// Concurrency-safe.
func Icon(name string) image.Image {
     loadIconsOnce.Do(loadIcons)
     return icons[name]
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胁镐,一起剝皮案震驚了整個(gè)濱河市蘸吓,隨后出現(xiàn)的幾起案子车海,更是在濱河造成了極大的恐慌枢舶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肩豁,死亡現(xiàn)場(chǎng)離奇詭異脊串,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)清钥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門琼锋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人循捺,你說我怎么就攤上這事斩例。” “怎么了从橘?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)础钠。 經(jīng)常有香客問我恰力,道長(zhǎng),這世上最難降的妖魔是什么旗吁? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任踩萎,我火速辦了婚禮,結(jié)果婚禮上很钓,老公的妹妹穿的比我還像新娘香府。我一直安慰自己董栽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布企孩。 她就那樣靜靜地躺著锭碳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勿璃。 梳的紋絲不亂的頭發(fā)上擒抛,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音补疑,去河邊找鬼歧沪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莲组,可吹牛的內(nèi)容都是我干的诊胞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锹杈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撵孤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嬉橙,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤早直,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后市框,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞扬,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年枫振,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喻圃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粪滤,死狀恐怖斧拍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杖小,我是刑警寧澤肆汹,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站予权,受9級(jí)特大地震影響昂勉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扫腺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一岗照、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦攒至、人聲如沸厚者。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽库菲。三九已至,卻和暖如春渠抹,著一層夾襖步出監(jiān)牢的瞬間蝙昙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工梧却, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奇颠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓放航,卻偏偏與公主長(zhǎng)得像烈拒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子广鳍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 介紹 如何保證在一個(gè)goroutine中看到在另一個(gè)goroutine修改的變量的值荆几,這篇文章進(jìn)行了詳細(xì)說明。 建...
    51reboot閱讀 19,662評(píng)論 11 41
  • Go(又稱Golang)是Google開發(fā)的一種靜態(tài)強(qiáng)類型赊时、編譯型吨铸、并發(fā)型,并具有垃圾回收功能的編程語言祖秒。Go于2...
    臣以君綱閱讀 3,767評(píng)論 0 4
  • 開發(fā)go程序的時(shí)候诞吱,時(shí)常需要使用goroutine并發(fā)處理任務(wù),有時(shí)候這些goroutine是相互獨(dú)立的竭缝,而有的時(shí)...
    駐馬聽雪閱讀 2,436評(píng)論 0 21
  • Go的內(nèi)存模型 看完這篇文章你會(huì)明白 一個(gè)Go程序在啟動(dòng)時(shí)的執(zhí)行順序 并發(fā)的執(zhí)行順序 并發(fā)環(huán)境下如何保證數(shù)據(jù)的同步...
    初級(jí)賽亞人閱讀 2,852評(píng)論 0 2
  • 你有夢(mèng) 我有夢(mèng) 我們遇見了 你背棄 我受了 卻不曾想 你卻懇求回頭 我收了 卻不料想 你變了 那樣肆無忌憚 那樣痛...
    海市蜃樓你的眼閱讀 201評(píng)論 0 1