亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Golang的互斥鎖只是一個君子協定

標簽:
Go

golang中的互斥锁并不能锁定任何内存或代码或变量。


下面代码先启动一个goroutin将变量锁住,然后在main函数里直接操作。

var wg sync.WaitGroupvar name = "hello world"var mu sync.Mutexfunc main() {
    wg.Add(1)    go modify()

    name = "dddddd" //有锁应该修改失败或者阻塞
    fmt.Println("in main", name)

    wg.Wait()
}func modify() {    defer wg.Done()
    mu.Lock()    defer mu.Unlock()

    name = "modify"
    <-time.After(2 * time.Second)
    fmt.Println("in modify", name)
}

结果

in main ddddddin modify dddddd

main函数里成功修改,意味着Lock并不能保护任何内存或变量,不使用锁的代码仍然可以随便操作。

go的mutex只是一个君子协定:在有可能造成race condition的地方,通过判断状态(是否已Lock)来决定能否操作。而非强制性保护。即:Lock()之前先通过状态判断是否为“可以操作”,如果可以就修改状态,保证其他goroutine查询状态的结果是“不可操作,需等待”。修改完成后将状态改为“可以操作”,后续gouroutine才能接手。

所以必须在所有可能造成race condition的代码处加上Lock,保证其遵守君子约定,否则这段代码就会是一个“野蛮人”可以随意操作了。

mutex变量可以定义多个,用来保护不同操作对象的代码段。然而需要保护同一个对象的代码必须使用同一个mutex才会生效。所以最好按需定义,如:

type data struct{
    muIn sync.Mutex //用于保护data内的数据同一时间只能有一处操作
    v int}var muOut sync.Mutex //用于保护其它操作对象



作者:流芳不待人
链接:https://www.jianshu.com/p/fc86b68fa1ad

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 1
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消