当一组 goroutine 互相等待并且没有一个 goroutine 能够继续执行时,就会发生死锁。
例如:
func main() {
ch := make(chan int)
ch <- 1
fmt.Println(<-ch)
}
Run Code Online (Sandbox Code Playgroud)
但如果我们不使用通道,是否有可能发生死锁呢?
为了产生死锁,您只需要一个(或多个)组件以一种没有人会先继续的方式等待。
通道是 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)