Golang并发chan(管道)有无缓冲详解

使用Golang有一段时间了,今天来说说Golang并发中chan的作用,书本和网上讲解的并不是特别容易理解(对于没有高并发经验的人来讲)

首先先明白一点:无缓冲=堵塞,缓冲=非堵塞

先来一段无缓冲的代码:

QQ截图20170121165722.jpg

这段代码执行的非常顺利!但是如果我把m<-1放在go test()上面会出现什么情况呢?

QQ截图20170121170241.jpg

Golang报错了!我们最开始的时候已经说了无缓冲就是堵塞。意味着不能把m<-1放到go test()上面,如果放到上面就表示后面的代码堵塞不执行了。

再来看一段有缓冲:

QQ截图20170121170730.jpg

咦!不报错啦!为啥呢?不一样的地方也就make(chan int,1)多一个1吗?

这个1你可以理解为容量,就是说m这个chan类型可以容下一个m<-1,没人来取时就不堵塞,如果

QQ截图20170121171206.jpg

细心的人可能发现数据执行有些问题,为什么循环执行好了,不再最后面呢?

因为是不堵塞的,所以就不能保证谁能先执行了。

Comments : 0

有问题可在下面发表评论,当然没事也可以在下面吹吹牛皮、扯扯淡!

发表评论

*


Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/blog/content/templates/Bitter/footer.php:40) in /www/wwwroot/blog/include/lib/view.php on line 23