golang中为何在同一个goroutine中使用无缓冲通道会导致死锁

package main

import "fmt"

func main() {
	/*
	以下程序会导致死锁
	c := make(chan int)
	c <- 10
	n1 := <-c
	fmt.Println(n1)
	为什么在同一个goroutine中使用无缓冲通道会导致死锁?
	原因:1. 如果通道无缓冲区,则发送方会阻塞,直到接收方接收到该值
		 2. 如果通道有缓冲区,则发送方会阻塞到值被复制到缓冲区,然后解堵塞,
			如果缓冲区已满,则会阻塞到其它goroutine从通道缓冲区中取走一个数据,然后再将值复制到缓冲区,最后解堵塞
	*/
	// 以下程序就可以正常执行,main goroutine负责从无缓冲通道中接收数据,子goroutine负责往通道中写入数据
	c := make(chan int)
	go func() {
		for i := 0; i < 10; i++ {
			c <- i * 10
		}
		close(c)  // 关闭通道
	}()
	// 使用此方法必须关闭通道
	for i := range c {
		fmt.Println(i)
	}
	/* 使用此方法可以比关闭通道
	for i := 0; i < 10; i++ {
		fmt.Println(<-c)
	}
	*/
}

  

posted @ 2021-10-14 13:45  专职  阅读(163)  评论(0编辑  收藏  举报