Go-channel锁机制

2019-12-26  本文已影响0人  骑蜗上高速

死锁:
1、单goroutine自己死锁
channel应该至少在两个以上的goroutine中进行通信,否则死锁
代码示例:

package main
import "fmt"
func main () {
    ch := make(chan int)
    ch <- 88
    num :=<- ch
    fmt.Println("读到",num)
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

2、goroutine之间channel访问顺序导致死锁
使用channel一端读(写),需要保证另一端写(读)
示例代码:

package main
import "fmt"
func main () {
    ch := make(chan int)
    num :=<- ch
    go func() {
        ch <- 88
    }()

    fmt.Println("读到",num)
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

正确的顺序是:

package main
import "fmt"
func main () {
    ch := make(chan int)
    go func() {
        ch <- 88
    }()
    num :=<- ch
    fmt.Println("读到",num)
}

结果:

读到 88

3、多goroutine,多channel交叉死锁。channel和mutex同时使用会产生交叉死锁。

package main
func main () {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go func() {
        for {
            select {
            case num1 := <- ch1:
                ch2 <- num1
            }
        }
    }()
    for {
        select {
        case num2 := <- ch2:
            ch1 <- num2
        }
    }
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

4、在go中,尽量不要将互斥锁、读写锁与channel混用 ------隐性死锁 。

上一篇下一篇

猜你喜欢

热点阅读