面试题答案
一键面试在Go语言中,使用无缓冲通道时,以下常见场景易导致死锁:
- 只发送不接收:
package main
func main() {
ch := make(chan int)
ch <- 1 // 发送数据,但没有协程接收,导致死锁
}
- 只接收不发送:
package main
func main() {
ch := make(chan int)
<-ch // 接收数据,但没有协程发送,导致死锁
}
- 在同一个协程中先接收后发送:
package main
func main() {
ch := make(chan int)
num := <-ch
ch <- num + 1 // 先接收,但没有其他协程发送,导致死锁
}
- 多个协程循环发送接收但无合适同步:
package main
func main() {
ch := make(chan int)
go func() {
for {
ch <- 1
}
}()
go func() {
for {
<-ch
}
}()
select {} // 主协程阻塞,导致整个程序死锁
}
上述代码在不同场景下因无缓冲通道的收发不匹配而导致死锁。无缓冲通道要求发送和接收操作必须同时准备好,否则就会阻塞,若阻塞情况形成循环依赖,就会导致死锁。