go 死锁示例

以下代码不会有任何打印。原因是:channel ch 在make 时是无缓冲区的channel。无缓冲区的channel 发送一个数据进入后需要等待这个数据被消耗才能继续发送下一个数据。然而getFromChannel 方法中的使用了锁。导致与sendToChannel 方法中使用的锁,形成死锁。如果指定ch 的缓冲区长度为10,则可以避免。当然也可以取消sendToChannel 方法中的锁。


var ch chan int
var mutex sync.Mutex

func main() {
	ch = make(chan int)
	go getFromChannel()
	go sendToChannel()
	select {

	}
}

func sendToChannel() {
	mutex.Lock()
	for i := 0; i < 10; i ++ {
		ch <- i
	}
	mutex.Unlock()
}

func getFromChannel() {
	for  {
		select {
			case c := <- ch:
				mutex.Lock()
				fmt.Println(c)
				mutex.Unlock()

		}
	}
}

posted @ 2022-05-26 20:07  熊先生不开玩笑  阅读(125)  评论(0)    收藏  举报