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 解锁。
相关文章推荐
- Mysql学习总结(46)——8种常被忽视的SQL错误用法
- sync.WaitGroup的错误用法与纠正
- 你不知道的Eclipse用法:使用PMD预先检测错误
- 避免常见的6种HTML5错误用法
- XDebug用法大全(一)错误调试
- Golang从入门到精通(二十二):Golang错误处理之defer
- golang中image/draw包用法
- PHP中错误与异常的日志记录用法分析
- linux svn错误:SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法。
- s:if 标签 字符串比较 正确用法和错误用法
- JAVA Scanner 用法注意事项(scanner 使用错误:Exception in thread "main" java.util.NoSuchElementExceptionation )
- Golang JSON的进阶用法实例讲解
- golang 中io包用法(一)
- Selenium遇到的问题8 python利用xlwt模块操作xls数据显示IO错误(Python中正反斜杠的用法)
- redirect的错误用法asp.net怎么使用自定义错误
- golang中net/http包用法
- golang 的 http cookie 用法
- golang中container/list包用法
- Regsvr32 用法和错误消息的说明
- 无坑安装使用godep(golang.org/x/tools/go/vcs的错误解决方案)