有一個(gè)緩存位置的通道,在被接收數(shù)據(jù)之前也是阻塞的嗎?
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個(gè)緩存通道去掉,改成非緩存通道,程序還是可以執(zhí)行的。請問有一個(gè)緩存位置的通道,在被接收數(shù)據(jù)之前也是和非緩存通道一樣,是阻塞的嗎?
2019-04-08
這里的‘在被接受數(shù)據(jù)之前’指的是ch<-1存數(shù)據(jù)吧。
緩沖的channel:保證往緩沖中存數(shù)據(jù)先于對應(yīng)的取數(shù)據(jù),簡單說就是在取的時(shí)候里面肯定有數(shù)據(jù),否則就因取不到而阻塞。所以緩沖的channel可能在取數(shù)據(jù)的時(shí)候發(fā)生阻塞。
非緩沖的channel:保證取數(shù)據(jù)先于存數(shù)據(jù),就是保證存的時(shí)候肯定有其他的goroutine在取,否則就因放不進(jìn)去而阻塞。所以非緩沖的channel可能在存數(shù)據(jù)的時(shí)候會(huì)發(fā)生阻塞。