qq_慕圣411555
2019-04-07 12:40
package main
import (
"fmt"
)
func main() {
ch := make(chan int 1)
go func() {
fmt.Println("1")
ch <- 1
}()
<-ch
go func() {
fmt.Println("2")
ch <- 1
}()
<-ch
go func() {
fmt.Println("3")
ch <- 1
}()
<-ch
}
把上面的1个缓存通道去掉,改成非缓存通道,程序还是可以执行的。请问有一个缓存位置的通道,在被接收数据之前也是和非缓存通道一样,是阻塞的吗?
这里的‘在被接受数据之前’指的是ch<-1存数据吧。
缓冲的channel:保证往缓冲中存数据先于对应的取数据,简单说就是在取的时候里面肯定有数据,否则就因取不到而阻塞。所以缓冲的channel可能在取数据的时候发生阻塞。
非缓冲的channel:保证取数据先于存数据,就是保证存的时候肯定有其他的goroutine在取,否则就因放不进去而阻塞。所以非缓冲的channel可能在存数据的时候会发生阻塞。
Go语言第一课
107795 学习 · 148 问题
相似问题