首先我们介绍一下死锁,看看它的定义
死锁 : 不是一种锁,而是一种错误使用锁导致的现象
1.单go程自己死锁
channel应该在至少2个以上的go程中进行通信,否则死锁
2.go程间channel访问顺序导致死锁
使用channel一端读(写),要博阿正另一端写(读),同时有机会执行,否则死锁
3.多go程,多channel交叉导致死锁
A go程,掌握M的同时,尝试拿N;B go程,掌握N的同时尝试拿M
4.在go语言汇总,尽量不要将互斥锁、读写锁与channel混用 ------ 会造成隐形死锁
2,3类型死锁的例子
func main11(){
ch:= make(chan int)
go func() {
ch<- 789
}()
num:= <- ch
fmt.Println("num = ",num)
}
func main(){
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for {
select {
case num:=<- ch1:
ch2 <- num
}
}
}()
for {
select {
case num:= <-ch2:
ch1<-num
}
}
}
互斥锁:
每个资源都对应于一个可称为 “互斥锁” 的标记,这个标记用来保证在任意时刻,只能有一个协程(线程)访问该资源。其它的协程只能等待。
互斥锁是传统并发编程对共享资源进行访问控制的主