产生死锁的场景有两种:
1..当一个channel
中没有数据,而直接读取时,会发生死锁。(空读)
2.当channel数据满了,再尝试写数据会造成死锁。(满写)
简单记忆 “空读满写”
举例:
1.当一个channel
中没有数据,而直接读取时,会发生死锁:
q := make(chan int,2)
<-q
解决方案是采用select语句,再default放默认处理方式:
q := make(chan int,2)
select{
case val:=<-q:
default:
...
}
2.当channel数据满了,再尝试写数据会造成死锁:
q := make(chan int,2)
q<-1
q<-2
q<-3
解决方法,采用select
func main() {
q := make(chan int, 2)
q <- 1
q <- 2
select {
case q <- 3:
fmt.Println("ok")
default:
fmt.Println("wrong")
}
}
提醒:向已经关闭的channel
中写入数据,这种造成的不是死锁,而是产生panic,但是可以从已经
关闭的channel
中读取数据。
func main() {
q := make(chan int, 2)
close(q)
q <- 1
}
输入出:
panic: send on closed channel
goroutine 1 [running]:
main.main()
/home/erick/Desktop/Book/Parallel/final.go:154 +0x63
exit status 2
func main() {
q := make(chan int, 3)
q <- 1
q <- 2
q <- 3
close(q)
for v := range q {
fmt.Println(v)
}
}