当前位置:首页 > Golang杂记 > 正文内容

Go channel 协程为什么是安全的

2年前 (2021-02-23)Golang杂记3839

    Channel跟java/php的 thread不一样,首先channel是协程不是线程。channel不会产生新的线程,

自然不会涉及到新的进程或者线程调度。所以就不存在线程安全这个概念了.  

Go channel为什么是安全的?

    Golang的Channel,发送一个数据到Channel 和从Channel接收一个数据都是原子性的。

这个可以看源码就知道channel内部维护了一个互斥锁,来保证线程安全:

go channe设计原理


      而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存,前者就是传统的加锁,后者就是Channel。

      也就是说,设计Channel的主要目的就是在多任务间传递数据的,这当然是安全的.因为channel底层实现出队入队时也加锁了.

    扫描二维码推送至手机访问。

    版权声明:本文由周伯通的博客发布,如需转载请注明出处。

    本文链接:https://www.zhoubotong.site/post/25.html

    分享给朋友:

    相关文章

    谈谈go中sync.cond的用法和理解

    引入不管从说明还是用法来看,Cond都是sync包中最难理解和使用的功能。golang官方注释中说,“Cond implements a condition variable, a rendezvou...

    Go slice初始化转换json

            切片slice的声明和初始化 , 如果我们只是单纯的声明 var list []string ...

    windows下编译linux可执行程序

    开发中,我们可以在Windows下编译Linux 64位可执行程序,首先获取目标系统所支持的构架,比如x86/x64/arm64/arm 等等。在 linux 系统中,我们可以使用命令 uname -...

    Go语言中的零值

    开箱即用什么叫开箱即用呢?因为Go语言的零值让程序变得更简单了,有些场景我们不需要显示初始化就可以直接用,举几个例子:切片,他的零值是nil,即使不用make进行初始化也是可以直接使用的,例如:pac...

    golang的defer踩坑汇总

    defer语句用于延迟函数调用,每次会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行。延迟函数可以有参数:延迟函数的参数在defer语句出现时就已确定下来(传值的就是当前值)return先赋值...

    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。