channel加锁的理解
来源:13-9 使用channel容易出现deadlock的原因

城中城
2022-05-15
无缓冲的 channel
在写入数据时会加锁并阻塞,直到消费者进行消费后进行解锁
有缓冲的 channel
是不是 缓冲队列满了之后, 写入数据 也是会加锁并阻塞, 直到消费者进行消费了 一个后解锁
并且 有缓存 和 无缓冲最大的区别在于
有缓存 可以在 协程未开启前 提前存放一个数据进去
无缓存 不可以
var wg sync.WaitGroup
func consumer(queue <-chan int) {
defer wg.Done()
//data := <-queue
for {
data, ok := <-queue
if !ok {
break
} else {
fmt.Println(data)
fmt.Println(ok)
time.Sleep(time.Second)
//queue <- 2
}
}
}
func main() {
// 有没有缓冲 1. 有缓冲 2. 无缓冲
// 双向的还是单向 为了安全 还提供了单向channel
var msg chan int // 双向
//var msg chan<- int // 存值
//var msg <-chan int // 取值
msg = make(chan int, 1) // 第一种初始化方式: 无缓冲
wg.Add(1)
msg <- 2
go consumer(msg) // 普通的 channel 可以直接转换为单向的 channel
msg <- 1 // 将1放入到channel中
msg <- 3
msg <- 3
msg <- 3
msg <- 3
msg <- 3
fmt.Println(555)
//fmt.Println("主:", <-msg)
close(msg)
wg.Wait()
}
写回答
1回答
-
是的,理解没有问题, channel内部就是使用了mutex锁机制实现的
00
相似问题