MST

星途 面试题库

面试题:Go带缓冲通道的阻塞与非阻塞情况分析

在Go语言中,假设存在一个带缓冲通道ch := make(chan int, 5),请详细分析以下几种操作场景下的阻塞与非阻塞情况,并解释原因:1. 连续向通道写入6个数据;2. 先向通道写入5个数据,再读取一个数据,然后再写入一个数据;3. 先向通道写入3个数据,然后同时启动5个协程从通道读取数据。
50.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 连续向通道写入6个数据
    • 阻塞情况:前5次写入是非阻塞的,因为通道带缓冲为5,可以容纳5个数据。第6次写入会阻塞。
    • 原因:Go语言中,带缓冲通道在有空闲缓冲区时写入操作不会阻塞。当缓冲区满了(这里容纳5个数据后已满),再进行写入操作就会阻塞,直到有其他协程从通道读取数据,腾出空间。
  2. 先向通道写入5个数据,再读取一个数据,然后再写入一个数据
    • 阻塞情况:前5次写入是非阻塞的,因为通道缓冲可以容纳5个数据。读取一个数据是非阻塞的,因为通道中有数据可读。最后一次写入也是非阻塞的。
    • 原因:写入时,只要通道缓冲区有空间就不会阻塞。读取时,只要通道中有数据就不会阻塞。当读取一个数据后,通道缓冲区有了一个空闲位置,所以最后一次写入可以顺利完成,不会阻塞。
  3. 先向通道写入3个数据,然后同时启动5个协程从通道读取数据
    • 阻塞情况:前3次写入是非阻塞的,因为通道有足够缓冲空间。启动的5个协程中,前3个协程读取数据是非阻塞的,因为通道中有3个数据可读。后2个协程读取数据会阻塞。
    • 原因:写入时,只要通道缓冲区有空间就不会阻塞。读取时,只要通道中有数据就不会阻塞。当通道中的3个数据被前3个协程读取后,通道中没有数据了,此时后2个协程尝试读取数据就会阻塞,直到有其他协程向通道写入数据。