Golang中无缓冲通道(容量0)与容量1缓冲通道的差异问询
关于Go语言通道通信的问题解答
问题1:「收发双方均就绪」具体指什么?是否存在先后顺序,是否必须接收方先就绪?
- 「收发双方均就绪」指的是:发送方的goroutine已经执行到
ch <- 值语句,进入等待发送的阻塞状态;接收方的goroutine已经执行到<- ch或val := <- ch语句,进入等待接收的阻塞状态。只有两者都到达对应通道操作语句并处于等待状态时,无缓冲通道的通信才能完成。 - 不存在固定先后顺序,也无需接收方先就绪:不管是发送方先执行到发送语句并阻塞,还是接收方先执行到接收语句并阻塞,只要另一方也到达对应通道操作语句,通信就会立刻完成,双方解除阻塞继续执行后续代码。
问题2:通道容量为3时,ch <- "C"下方的代码是否仍会运行?
结果取决于通道当前已存元素的数量:
- 如果通道内元素少于3个(还有空闲缓冲位),执行
ch <- "C"后发送方goroutine不会阻塞,下方代码会正常运行。 - 如果通道内已有3个元素(通道已满),执行
ch <- "C"时发送方会被阻塞,下方代码要等到其他goroutine从通道接收元素、腾出缓冲位后,才能继续运行。
问题3:容量为0时发送方下方代码是否不会运行,而容量为1时即使通道满了发送方下方代码仍可运行?
这个说法不准确:
- 容量为0(无缓冲通道):发送方执行
ch <- 值后会立即阻塞,必须等接收方完成接收操作、通信结束后,才能继续执行下方代码,因此通信完成前下方代码确实不会运行。 - 容量为1(缓冲通道):当通道已满时,发送方执行
ch <- 值会被阻塞,此时下方代码同样不会运行,直到有接收方取走通道内元素、腾出位置,发送操作完成后才能继续执行。只有当通道为空时,发送方发送元素后不会阻塞,下方代码才会立刻运行。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

