无缓冲通道 vs 有缓冲通道
- 无缓冲通道,在通道满了之后就会阻塞所在的goroutine。(需要在其他goroutine中取出该通道中的元素,才能解除它所在通道的阻塞,不然就会一直阻塞下去。)
- 有缓冲通道,存完了东西可以不取出来,不会阻塞。
// 无缓冲通道,阻塞示例
func chanWillLock() {
chanNo := make(chan int) // 无缓冲
fmt.Println("1000")
// 到这一行就会一直阻塞,
// 除非有其他的goroutine中有取走它里面存的东西。
chanNo <- 1
fmt.Println("2000")
}
// 无缓冲通道,解除阻塞
func chanWillUnlockAfter3S() {
chanNo := make(chan int)
go func() {
// 等待
time.Sleep(time.Second * 3)
// 取出东西,
// 之后就会结束chanNo所在的goroutine的阻塞。
_ = <-chanNo
}()
fmt.Println("开始阻塞")
// 到这里会阻塞
chanNo <- 1000
fmt.Println("主 goroutine 退出")
}
// 有缓冲通道,阻塞示例
func chanDemo3() {
chan1 := make(chan int, 3)
fmt.Println("开始")
chan1 <- 100
chan1 <- 200
chan1 <- 300
// 容量满了,再放入400的时候才会造成阻塞。
//chan1 <- 400
fmt.Println("结束")
}