go中有缓存通道和无缓存通道区别

golang channel 有缓冲 与 无缓冲 是有重要区别的

我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式

其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别

那就是一个是同步的 一个是非同步的

怎么说?比如

c1:=make(chan int)        无缓冲

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

c1<-1                            

无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着

而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。

打个比喻

无缓冲的  就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。

无缓冲保证信能到你手上

有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。

有缓冲的 保证 信能进你家的邮箱

 

看测试代码

有缓冲的

 1 package main
 2 
 3 import "fmt"  4  5 var c = make(chan int, 1)  6  7 func f() {  8  9 c <- 'c' 10 11 fmt.Println("在goroutine内") 12 } 13 14 func main() { 15  go f() 16 
17     c <- 'c'
18     <-c 19 <-c 20 21 fmt.Println("外部调用") 22 }

 

无缓冲的

// pp
package main

import (
    "fmt" ) func writeRoutine(test_chan chan int, value int) { test_chan <- value } func readRoutine(test_chan chan int) { <-test_chan return } func main() { c := make(chan int) x := 100 //readRoutine(c) //go writeRoutine(c, x) //writeRoutine(c, x) //go readRoutine(c) //go readRoutine(c) //writeRoutine(c, x)  go writeRoutine(c, x)

  
    go writeRoutine(c, x)
    readRoutine(c)

    fmt.Println(x)
}

 可以在部分代码注释掉,看效果,再体会下

转载于:https://www.cnblogs.com/Ellon-Daris/p/5403846.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值