如果我们不使用通道,是否可能会发生死锁?

Rez*_*dra 1 go

当一组 goroutine 互相等待并且没有一个 goroutine 能够继续执行时,就会发生死锁。

例如:

func main() {
        ch := make(chan int)
        ch <- 1
        fmt.Println(<-ch)
}
Run Code Online (Sandbox Code Playgroud)

但如果我们不使用通道,是否有可能发生死锁呢?

Mar*_*arc 6

为了产生死锁,您只需要一个(或多个)组件以一种没有人会先继续的方式等待。

通道是 Go 中遇到死锁的常见方式,但任何用于同步的东西也可能触发死锁。

以下是一些简单死锁的示例:

互斥体:

package main

import "sync"

func main() {
    var mu sync.Mutex
    mu.Lock()
    mu.Lock()
}
Run Code Online (Sandbox Code Playgroud)

等待组:

package main

import "sync"

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)