无缓冲channel与容量为1的channel的区别

无缓冲channel与容量为1的channel的区别有缓冲和无缓冲channel的声明下面简要说明它们之间的区别,先声明两个channel分别有缓冲1和无缓冲:复制代码c1:=make(chanint)//无缓冲c2:=make(chanint,1)//有缓冲无缓冲的channel下面讨论一个简单的场景:A向channel写入一个int,B从channel读走一个int,对于c1,可以假设A和B是两个goroutine,是两个并发单位。代码如下:复制代码c1<-1//A<-

无缓冲channel与容量为1的channel的区别"

有缓冲和无缓冲channel的声明

下面简要说明它们之间的区别,先声明两个channel分别有缓冲1和无缓冲:

复制代码

c1 := make(chan int) // 无缓冲
c2 := make(chan int, 1) // 有缓冲

无缓冲的channel

下面讨论一个简单的场景:A向channel写入一个int,B从channel读走一个int,
对于c1,可以假设A和B是两个goroutine,是两个并发单位。代码如下:

复制代码

c1 <- 1   // A
<- c1     // B

重点来了:这里的A或B,无论谁先执行,谁都会阻塞以等待另一个goroutine执行,也就是说往里写得等来读的,从里读得等来写的。最重要的是,A和B对c1的读写是同步的,直观的理解是A和B对c1的读写是同时发生的,当A对c1写完了,则B从c1中就读完了。这样的特性可以用于做并发单位之间的同步操作,如果在A和B中对同一个无缓冲通道进行了读写,那么A和B一定会在读写的地方进行同步,谁先到谁阻塞等待另外一个。
综上,如果在一个协程里写这样的代码,一定会死锁:

复制代码

func main() {
	ch := make(chan int)
	ch <- 1
        <- ch
}

无缓冲的channel的读写者必须同时完成发送和接收,而不能串行,显然单协程无法满足。所以这里造成了循环等待,会死锁。

缓冲为1的channel

我们依然继续上面提到的简单场景:A向channel写入一个int,B从channel读走一个int。还是一样的代码:

复制代码

c2 <- 1   // A
<- c2     // B

这里和无缓冲通道不同的地方在于:有缓冲的通道并不强制channel的读写者必须同时完成发送和接收,读者只会在没有数据时阻塞,写者只会在没有可用容量时阻塞,这就有点像阻塞队列了。

转载地址:https://www.cnblogs.com/jo3yzhu/p/13559761.html

今天的文章无缓冲channel与容量为1的channel的区别分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31493.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注