分享
  1. 首页
  2. 文章

Golang系列1之deadlock

余滴滴 · · 1994 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

因为公司安排,我临时从Java项目组调往Go项目组,经过差不多5天业余时间对Go学习后,架构师让我给公司同事进行了Golang的分享和培训.
同事们很热爱技术, 本来预计40分钟的分享, 由于同事们积极的讨论和Go大佬同事的热情补充分享, 最终持续了2个多小时. 我把此次分享中几个讨论热烈的重要知识点记录下来, 方便大家入门GO的时候避坑.

go中的dealock主要分为两类:

1. channel相关的死锁

读写nil channel,导致的死锁

func main() {
 ch := make(chan int)
 ch <- 1 
}

goroutine 1 [chan send]:

image.png

2. 教科书式的死锁

这个是操作系统教科书中的死锁,互相等待对方释放锁。

var lock1 *sync.Mutex
var lock2 *sync.Mutex
func main() {
 lock1 = new(sync.Mutex)
 lock2 = new(sync.Mutex)
 go func() {
 lock1.Lock()
 fmt.Println("I'm a goroutine,I have lock1,and I need lock2.")
 time.Sleep(time.Second)
 lock2.Lock()
 lock2.Unlock()
 lock1.Unlock()
 }()
 lock2.Lock()
 fmt.Println("I'm the main goroutine,I have lock2,and I need lock1.")
 time.Sleep(time.Second)
 lock1.Lock()
 lock1.Unlock()
 lock2.Unlock()
 time.Sleep(5 * time.Second)
}

goroutine 1 [semacquire]:

image.png

易错点

Q: 是不是只要唯一的mian goroutine阻塞了,就会导致死锁
A: 不是,只有nil channel导致的阻塞,才会导致死锁. 由于其他原因导致的阻塞不会导致死锁,如下面这个例子.

func main() {
 log.Fatal(http.ListenAndServe(":8000", nil)) //block
 log.Print("This doesn't print")
 fmt.Println("Can't reach here.")
}

Q: 什么时候go的runtime会检索到deadlock
A: 只有当所有的goroutine都不能被访问时候, go的runtime会检测到这种情况,并抛出deadlock. (TODO,这个结论还是不太完善)

更多deadlock的例子: https://gitee.com/sicnu-yudidi/go/tree/master/go-3/deadlock

https://programming.guide/go/detect-deadlock.html
https://stackoverflow.com/questions/42432880/why-does-this-goroutine-block


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:余滴滴

查看原文:Golang系列1之deadlock

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1994 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏