• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解Golang并发操作中常见的死锁情形

    什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你。我俩都这么想,这事就解决不了了。

    第一种情形:无缓存能力的管道,自己写完自己读

    先上代码:

    func main() {
        ch := make(chan int, 0)
    ​
        ch - 666
        x := - ch
        fmt.Println(x)
    }
    
    

    我们可以看到这是一个没有缓存能力的管道,然后往里面写666,然后就去管道里面读。这样肯定会出现问题啊!一个无缓存能力的管道,没有人读,你也写不了,没有人写,你也读不了,这正是一种死锁!

    fatal error: all goroutines are asleep - deadlock!

    解决办法很简单,开辟两条协程,一条协程写,一条协程读。

    第二种情形:协程来晚了

    func main() {
        ch := make(chan int,0)
        ch - 666
        go func() {
            - ch
        }()
    }
    

    我们可以看到,这条协程开辟在将数字写入到管道之后,因为没有人读,管道就不能写,然后写入管道的操作就一直阻塞。这时候你就有疑惑了,不是开辟了一条协程在读吗?但是那条协程开辟在写入管道之后,如果不能写入管道,就开辟不了协程。

    第三种情形:管道读写时,相互要求对方先读/写

    如果相互要求对方先读/写,自己再读/写,就会造成死锁。

    func main() {
        chHusband := make(chan int,0)
        chWife := make(chan int,0)
    ​
        go func() {
            select {
            case - chHusband:
                chWife-888
            }
        }()
    ​
        select {
            case - chWife:
                chHusband - 888
        }
    }
    
    

    先来看看老婆协程,chWife只要能读出来,也就是老婆有钱,就给老公发个八百八十八的大红包。

    再看看老公的协程,一看不得了,咋啦?老公也说只要他有钱就给老婆包个八百八十八的大红包。

    两个人都说自己没钱,老公也给老婆发不了红包,老婆也给老公发不了红包,这就是死锁!

    第四种情形:读写锁相互阻塞,形成隐形死锁

    先来看一看代码:

    func main() {
        var rmw09 sync.RWMutex
        ch := make(chan int,0)
    ​
        go func() {
            rmw09.Lock()
            ch - 123
            rmw09.Unlock()
        }()
    ​
        go func() {
            rmw09.RLock()
            x := - ch
            fmt.Println("读到",x)
            rmw09.RUnlock()
        }()
    ​
        for {
            runtime.GC()
        }
    }

    这两条协程,如果第一条协程先抢到了只写锁,另一条协程就不能抢只读锁了,那么因为另外一条协程没有读,所以第一条协程就写不进。

    如果第二条协程先抢到了只读锁,另一条协程就不能抢只写锁了,那么因为另外一条协程没有写,所以第二条协程就读不到。

    到此这篇关于详解Golang并发操作中常见的死锁情形的文章就介绍到这了,更多相关Golang 并发死锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Go 语言中的死锁问题解决
    • Go语言死锁与goroutine泄露问题的解决
    • golang coroutine 的等待与死锁用法
    • go select编译期的优化处理逻辑使用场景分析
    • Django实现jquery select2带搜索的下拉框
    • Go语言使用select{}阻塞main函数介绍
    • matplotlib之多边形选区(PolygonSelector)的使用
    • golang中的select关键字用法总结
    • Go select 死锁的一个细节
    上一篇:Go之集合slice的实现
    下一篇:Go操作etcd的实现示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解Golang并发操作中常见的死锁情形 详解,Golang,并发,操作,中,