go语言中的协程(goroutine
)和通道(channel
)提供非常好的处理并发的方式,基于协程(goroutine
)和通道(channel
)可以将并发中的数据简单化。但用不好则会带来许多问题,死锁就是协程出现问题的一种表现形式。
那什么是死锁?按照我对go死锁的理解,就是在程序中的代码被阻塞
了,运行不下去,导致程序报错。
在go语言中,主要存在这几种死锁情况
1.无缓冲通道的死锁
package main
import "fmt"
func main() {
c := make(chan int)
c <- 1 // 我被阻塞了
fmt.Println("i am locked")
}
对于无缓冲通道c
,在主协程中将1
赋值给了他,但并没有在其他协程中被使用,导致程序被阻塞。
package main
import "fmt"
func main() {
c := make(chan int)
c <- 1