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

在Go的协程里面死锁通常就是永久阻塞了,本文主要介绍了Golang并发操作中常见的死锁情形,具有一定的参考价值,感兴趣的可以了解一下

详解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 并发死锁内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/19648.html

(0)
nan
上一篇 2021-09-01
下一篇 2021-09-01

相关推荐

  • 华为儿童手表4pro防水吗?防水性能如何

    作为孩子们时时佩戴的物品,稍有不慎可能就会碰到水,因此儿童手表的防水功能也是很多家长关心的问题。今天小编为大家准备了华为儿童手表4pro防水的相关信息,那么到底华为儿童手表4pro防水吗?如果防水,它的防水性能又如何?下面就和小编一起看看吧

    2021-07-31
    0
  • 小米12pro怎么打开快充(小米12pro有哪几种快充方式)

    众所周知小米12是小米最新发布的旗舰级手机型号,无论是电池电量或是电池充电速度各方面都有着很好的体验感,那么小米12pro快速充电如何打开呢?如今就由小编我来给大伙儿讲解吧。小米12pro快充方式一、有线充电120W有线秒充的两种模式,官方分别称为恒

    2022-01-16
    0
  • 华为P20系列内测全新鸿蒙OS:限量2000人

    HarmonyOS鸿蒙系统升级用户已经超过7000万,尤其一些多年的老设备,也借机焕发新生。最近,华为就在抓紧为P20系列适配鸿蒙OS,目前正处于限量内测阶段,近日就推送了最新的2.0.0.188版本(C00E

    2021-09-07
    0
  • 2021年福布斯全球富豪排行榜(福布斯富豪排行榜2021最新排名)

    《福布斯》纽约4月6日——今天,《福布斯》正式公布第35期全球亿万富豪榜,2,755名亿万富豪登上榜单,其中包括493名新上榜者。从各个角度而言,都可谓前所未有;而2020年又是全球各大经济体受到新冠肺炎疫情猛烈冲击的一年,意义非凡。2,755名亿万

    2022-01-08
    0
  • 美国一女子超市舔商品自证不怕新冠(美国人为什么这么爱作死?)

    疫情发生以来大家都非常的自律,出门必带口罩,尽量不去到人多的地方,但美国却并不是这样,甚至不少美国人开启了花样作死之旅。近日美国一女子超市舔商品自证不怕新冠,她还表示细菌可以增强免疫系统,实在是滑天下之大稽!美国一女子超市舔商品自证不怕新冠近日,美国一女子在超市用舔东西的方式证明新冠病毒“没什么”,她发布的视频在社交媒体上疯传。该女子名叫朱迪·梅舒克(J

    2021-08-11
    0
  • 谷歌第二代Pixel终于可以预购了

    导读谷歌上个月与Pixel6和Pixel6Pro一起推出了第二代PixelStand。尽管目前可以购买智能手机,但这款Google品牌的无线充电器却被排除在外。今天谷歌上个月与Pixel6和Pixel6Pro一起推出了第二代PixelStand。

    2021-12-27
    0

发表回复

登录后才能评论