Go 中的協(xié)程同步(鎖)

先來看一個簡單的例子,在不運行的前提下猜測結(jié)果是什么
這里模仿兩個人同時刷卡的操作凰兑,猜測最后剩余多少錢

package main

import (
    "time"
    "fmt"
)

type Account struct {
    money int
}

func (a *Account)DoPre()  {
    time.Sleep(time.Second)    // 模仿銀行進行檢測
}

func (a *Account)GetGongzi(n int)  {
    a.money += n
}
func (a *Account) GiveWife(n int) {
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
}

func (a *Account)Buy(n int)  {
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
}

func (a *Account) Left() int {
    return a.money
}


func main() {
    var account Account
    account.GetGongzi(10)
    go account.GiveWife(6)  // 媳婦花6塊
    go account.Buy(5)           // 同時自己花5塊
    time.Sleep(2 * time.Second)     // 等待程序全部執(zhí)行完畢
    fmt.Println(account.Left())
}
結(jié)果為-1.

是不是感覺很費解似舵。原因是當媳婦和自己在花錢的時候辩涝,同時搶到了相同的工資數(shù)(我們啟動了2個協(xié)程),經(jīng)過判斷都成立新蟆,則進入sleep 1秒鐘觅赊。 這時無論如何都會減去該花的錢。所以最后結(jié)果為 -1.

解決辦法琼稻,為數(shù)據(jù)加鎖吮螺,使其只有一人操作數(shù)據(jù)。

當然帕翻,解決的辦法有很多種鸠补,這只是go里面比較好的解決辦法

sync.Mutex
package main

import (
    "time"
    "fmt"
    "sync"
)

type Account struct {
    flag sync.Mutex     // 使用一種復(fù)式變量, 只有一個人鎖住嘀掸,其他人就會sleep 直到解鎖
    money int
}

func (a *Account)DoPre()  {
    time.Sleep(time.Second)    // 模仿銀行進行檢測
}

func (a *Account)GetGongzi(n int)  {
    a.money += n
}
func (a *Account) GiveWife(n int) {
    a.flag.Lock()       // 鎖住
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
    a.flag.Unlock()     // 釋放鎖
}

func (a *Account)Buy(n int)  {
    a.flag.Lock()
    if a.money > n {
        a.DoPre()
        a.money -= n
    }
    a.flag.Unlock()
}

func (a *Account) Left() int {
    return a.money
}


func main() {
    var account Account
    account.GetGongzi(10)
    go account.GiveWife(6)  // 媳婦花6塊
    go account.Buy(5)           // 同時自己花5塊
    time.Sleep(2 * time.Second)     // 等待程序全部執(zhí)行完畢
    fmt.Println(account.Left())
}

這樣結(jié)果就合乎邏輯了W涎摇!睬塌!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉蝌,一起剝皮案震驚了整個濱河市歇万,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勋陪,老刑警劉巖贪磺,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅愚,居然都是意外死亡寒锚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門违孝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刹前,“玉大人,你說我怎么就攤上這事等浊∪迹” “怎么了摹蘑?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵筹燕,是天一觀的道長。 經(jīng)常有香客問我衅鹿,道長撒踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任大渤,我火速辦了婚禮制妄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泵三。我一直安慰自己耕捞,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布烫幕。 她就那樣靜靜地躺著俺抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪较曼。 梳的紋絲不亂的頭發(fā)上磷斧,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音捷犹,去河邊找鬼弛饭。 笑死,一個胖子當著我的面吹牛萍歉,可吹牛的內(nèi)容都是我干的侣颂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼枪孩,長吁一口氣:“原來是場噩夢啊……” “哼憔晒!你這毒婦竟也來了胳蛮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丛晌,失蹤者是張志新(化名)和其女友劉穎仅炊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澎蛛,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡抚垄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谋逻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呆馁。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毁兆,靈堂內(nèi)的尸體忽然破棺而出浙滤,到底是詐尸還是另有隱情,我是刑警寧澤气堕,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布纺腊,位于F島的核電站,受9級特大地震影響茎芭,放射性物質(zhì)發(fā)生泄漏揖膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一梅桩、第九天 我趴在偏房一處隱蔽的房頂上張望壹粟。 院中可真熱鬧,春花似錦宿百、人聲如沸趁仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雀费。三九已至,卻和暖如春外臂,著一層夾襖步出監(jiān)牢的瞬間坐儿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工宋光, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留貌矿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓罪佳,卻偏偏與公主長得像逛漫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赘艳,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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