Go-channel锁机制
2019-12-26 本文已影响0人
骑蜗上高速
死锁:
1、单goroutine自己死锁
channel应该至少在两个以上的goroutine中进行通信,否则死锁
代码示例:
package main
import "fmt"
func main () {
ch := make(chan int)
ch <- 88
num :=<- ch
fmt.Println("读到",num)
}
输出结果:
fatal error: all goroutines are asleep - deadlock!
2、goroutine之间channel访问顺序导致死锁
使用channel一端读(写),需要保证另一端写(读)
示例代码:
package main
import "fmt"
func main () {
ch := make(chan int)
num :=<- ch
go func() {
ch <- 88
}()
fmt.Println("读到",num)
}
输出结果:
fatal error: all goroutines are asleep - deadlock!
正确的顺序是:
package main
import "fmt"
func main () {
ch := make(chan int)
go func() {
ch <- 88
}()
num :=<- ch
fmt.Println("读到",num)
}
结果:
读到 88
3、多goroutine,多channel交叉死锁。channel和mutex同时使用会产生交叉死锁。
package main
func main () {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for {
select {
case num1 := <- ch1:
ch2 <- num1
}
}
}()
for {
select {
case num2 := <- ch2:
ch1 <- num2
}
}
}
输出结果:
fatal error: all goroutines are asleep - deadlock!
4、在go中,尽量不要将互斥锁、读写锁与channel混用 ------隐性死锁 。