在go语言中用channel通信稍不注意就会发生死锁情况,下面我们来看一下几种常见的死锁情况
第一种:同一个goroutine中,使用同一个 channel 读写。
1 | package main |
这是最简单的死锁情况 看运行结果
第二种:2个 以上的go程中, 使用同一个 channel 通信。 读写channel 先于 go程创建。
1 | package main |
这里如果想不成为死锁那匿名函数go程就要放到ch<-666这条语句前面
看运行结果
还是同样的错误,死锁。
第三种:2个以上的go程中,使用多个 channel 通信。 A go 程 获取channel 1 的同时,尝试使用channel 2, 同一时刻,B go 程 获取channel 2 的同时,尝试使用channel 1
1 | package main |
第三种是互相等对方造成死锁
第四种: 在go语言中, channel 和 读写锁、互斥锁 尽量避免交叉混用。——“隐形死锁”。如果必须使用。推荐借助“条件变量”
1 | package main |
这是一种隐形的死锁,我们来看一下结果
注意这几种的死锁情况