您的位置:首页 > 编程语言 > Go语言

golang 中 锁的错误的用法会导致死锁。

2017-07-25 11:07 232 查看
package main

import (
"sync"
"time"

. "github.com/soekchl/myUtils"
)

var mux sync.RWMutex

func tt() {
Notice()
mux.Lock() // 3
Notice()
defer mux.Unlock()
time.Sleep(time.Second * 5)

}

func main() {
go tt()

Notice()
mux.RLock() // 1
Notice()
defer mux.RUnlock()
time.Sleep(1 * time.Second)

Notice()
mux.RLock() // 2
Notice()
defer mux.RUnlock()
time.Sleep(5 * time.Second)
}


这块按照正常理论 没有问题,程序 有时运行也没有错误!  但是这样写不对的

如果  锁3 先运行 这问题就没有事儿

但是如果锁 1 先运行    然后 锁3   ,然后 锁2的话 就死锁了

锁1 运行的时候  申请所 成功

然后 锁3 排队申请锁

然后是 锁2 

因为锁2 排在 锁3 后面  所以   锁1的  defer 锁还没能运行    锁3 一直申请不下来,锁2也 一直排队下去  然后就死锁了!

大家在用锁的时候 特别要小心,特别是跟 defer 一起用的时候  

我的建议是吧        带锁的操作 放进 一个 小函数里 解决,不要再大一点的函数里 写 大量的  锁和defer 解锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: