无缓冲通道 vs 有缓冲通道

无缓冲通道 vs 有缓冲通道

  1. 无缓冲通道,在通道满了之后就会阻塞所在的goroutine。(需要在其他goroutine中取出该通道中的元素,才能解除它所在通道的阻塞,不然就会一直阻塞下去。)
  2. 有缓冲通道,存完了东西可以不取出来,不会阻塞。
// 无缓冲通道,阻塞示例
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("结束")
}

posted on 2021-02-23 14:12  Sweet小马  阅读(92)  评论(0编辑  收藏  举报

导航