MST

星途 面试题库

面试题:Go中无缓冲通道在什么场景下容易引发死锁

请描述在Go语言中,使用无缓冲通道时,哪些常见的代码编写场景容易导致死锁,并举例说明。
38.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,使用无缓冲通道时,以下常见场景易导致死锁:

  1. 只发送不接收
package main

func main() {
    ch := make(chan int)
    ch <- 1 // 发送数据,但没有协程接收,导致死锁
}
  1. 只接收不发送
package main

func main() {
    ch := make(chan int)
    <-ch // 接收数据,但没有协程发送,导致死锁
}
  1. 在同一个协程中先接收后发送
package main

func main() {
    ch := make(chan int)
    num := <-ch
    ch <- num + 1 // 先接收,但没有其他协程发送,导致死锁
}
  1. 多个协程循环发送接收但无合适同步
package main

func main() {
    ch := make(chan int)
    go func() {
        for {
            ch <- 1
        }
    }()
    go func() {
        for {
            <-ch
        }
    }()
    select {} // 主协程阻塞,导致整个程序死锁
}

上述代码在不同场景下因无缓冲通道的收发不匹配而导致死锁。无缓冲通道要求发送和接收操作必须同时准备好,否则就会阻塞,若阻塞情况形成循环依赖,就会导致死锁。