channel 死锁
死锁:
- 单个协程永久阻塞
- 两个或两个以上的协程执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞的现象。
channel 死锁场景:
- 非缓存channel只写不读
- 非缓存channel读在写后面
- 缓存channel写入超过缓冲区数量
- 空读
- 多个协程互相等待
1、非缓存chanel只写不读
func deadlock1(){ ch :=make(chan int) ch <-3 //这里会发生一直阻塞的情况,执行不到下一句 }
2、非缓存channel读在写后面
func deadlock2(){ ch :=make(chan int) ch <-3 num :=<-ch fmt.Println("nums",num) }
func deadlocak2(){ ch1 :=make(chan int)\ ch <-100 //这里会发生一直阻塞的情况,执行不到下一句 go func() { num := <-ch fmt.Println("num=",num) }() time.Sleep(time.Second) }
3、缓存channel写入超过缓冲区数量
func deadlock3(){ ch :=make(chan int, 3) ch <- 3 ch <- 4 ch <- 5 ch <- 6 //这里会发生一直阻塞的情况 }
4、空读
func deadlock4(){ ch :=make(chan int) fmt.Println(<-ch) // 这里会发生一直阻塞的情况 }
5、多个协程一直等待
func deadlocak5() { ch1 := make(chan int) ch2 := make(chan int) go func() { for { select { case num := <-ch1: fmt.Println("num=",num) ch2 <- 100 } } }() for { select { case num := <-ch2: fmt.Println("num=",num) ch1 <- 300 } } }