亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Golang并發(fā)操作中常見的死鎖情形

 更新時間:2021年09月01日 08:52:15   作者:ReganYue  
在Go的協(xié)程里面死鎖通常就是永久阻塞了,本文主要介紹了Golang并發(fā)操作中常見的死鎖情形,具有一定的參考價值,感興趣的可以了解一下

什么是死鎖,在Go的協(xié)程里面死鎖通常就是永久阻塞了,你拿著我的東西,要我先給你然后再給我,我拿著你的東西又讓你先給我,不然就不給你。我倆都這么想,這事就解決不了了。

第一種情形:無緩存能力的管道,自己寫完自己讀

先上代碼:

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

我們可以看到這是一個沒有緩存能力的管道,然后往里面寫666,然后就去管道里面讀。這樣肯定會出現(xiàn)問題?。∫粋€無緩存能力的管道,沒有人讀,你也寫不了,沒有人寫,你也讀不了,這正是一種死鎖!

fatal error: all goroutines are asleep - deadlock!

解決辦法很簡單,開辟兩條協(xié)程,一條協(xié)程寫,一條協(xié)程讀。

第二種情形:協(xié)程來晚了

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

我們可以看到,這條協(xié)程開辟在將數(shù)字寫入到管道之后,因?yàn)闆]有人讀,管道就不能寫,然后寫入管道的操作就一直阻塞。這時候你就有疑惑了,不是開辟了一條協(xié)程在讀嗎?但是那條協(xié)程開辟在寫入管道之后,如果不能寫入管道,就開辟不了協(xié)程。

第三種情形:管道讀寫時,相互要求對方先讀/寫

如果相互要求對方先讀/寫,自己再讀/寫,就會造成死鎖。

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

先來看看老婆協(xié)程,chWife只要能讀出來,也就是老婆有錢,就給老公發(fā)個八百八十八的大紅包。

再看看老公的協(xié)程,一看不得了,咋啦?老公也說只要他有錢就給老婆包個八百八十八的大紅包。

兩個人都說自己沒錢,老公也給老婆發(fā)不了紅包,老婆也給老公發(fā)不了紅包,這就是死鎖!

第四種情形:讀寫鎖相互阻塞,形成隱形死鎖

先來看一看代碼:

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()
    }
}

這兩條協(xié)程,如果第一條協(xié)程先搶到了只寫鎖,另一條協(xié)程就不能搶只讀鎖了,那么因?yàn)榱硗庖粭l協(xié)程沒有讀,所以第一條協(xié)程就寫不進(jìn)。

如果第二條協(xié)程先搶到了只讀鎖,另一條協(xié)程就不能搶只寫鎖了,那么因?yàn)榱硗庖粭l協(xié)程沒有寫,所以第二條協(xié)程就讀不到。

到此這篇關(guān)于詳解Golang并發(fā)操作中常見的死鎖情形的文章就介紹到這了,更多相關(guān)Golang 并發(fā)死鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 瞅一眼就能學(xué)會的GO并發(fā)編程使用教程

    瞅一眼就能學(xué)會的GO并發(fā)編程使用教程

    隨著互聯(lián)網(wǎng)的普及,互聯(lián)網(wǎng)用戶人數(shù)原來越多,這對系統(tǒng)的性能帶來了巨大的挑戰(zhàn)。這個時候就需要并發(fā)編程了,本文為大家整理了詳細(xì)的GO并發(fā)編程使用教程,讓你看完就能學(xué)會
    2023-02-02
  • Go語言中map集合的具體使用

    Go語言中map集合的具體使用

    本文主要介紹了Go語言中map集合的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Go語言Zap庫Logger的定制化和封裝使用詳解

    Go語言Zap庫Logger的定制化和封裝使用詳解

    這篇文章主要介紹了Go語言Zap庫Logger的定制化和封裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go項(xiàng)目編寫Makefile規(guī)則文件概述

    Go項(xiàng)目編寫Makefile規(guī)則文件概述

    這篇文章主要為大家介紹了Go項(xiàng)目編寫Makefile文件規(guī)則概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 在Go中使用JSON(附demo)

    在Go中使用JSON(附demo)

    Go開發(fā)人員經(jīng)常需要處理JSON內(nèi)容,本文主要介紹了在Go中使用JSON,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • go單例實(shí)現(xiàn)雙重檢測是否安全的示例代碼

    go單例實(shí)現(xiàn)雙重檢測是否安全的示例代碼

    這篇文章主要介紹了go單例實(shí)現(xiàn)雙重檢測是否安全,本文給大家分享雙重檢驗(yàn)示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • go語法入門匿名函數(shù)定義及使用示例詳解

    go語法入門匿名函數(shù)定義及使用示例詳解

    這篇文章主要為大家介紹了go語法入門匿名函數(shù)定義及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結(jié)

    go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結(jié)

    本文主要介紹了go語言中的數(shù)組指針和指針數(shù)組的區(qū)別小結(jié),文中通過示例代碼介紹的很詳細(xì),具有一定的參考價值,感興趣的可以了解一下
    2024-10-10
  • goFrame的隊(duì)列g(shù)queue對比channel使用詳解

    goFrame的隊(duì)列g(shù)queue對比channel使用詳解

    這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 通過案例詳細(xì)聊聊Go語言的變量與常量

    通過案例詳細(xì)聊聊Go語言的變量與常量

    在任何一門現(xiàn)代的高級語言中,變量和常量都是它非常基礎(chǔ)的程序結(jié)構(gòu)的組成部分,下面這篇文章主要給大家介紹了關(guān)于如何通過案例詳細(xì)聊聊Go語言的變量與常量的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評論