channel底层是加锁的,是一个有锁的环形队列。。故而肯定并发安全
可参考 golang之channel进阶
Channel 在运行时的内部表示是 runtime.hchan,该结构体中包含了一个用于保护成员变量的互斥锁,从某种程度上说,Channel 是一个用于同步和通信的有锁队列。
有很多试图通过各种方式 实现 无锁 Channel 的方案,但目前都还有各种各样问题尚不够完美.
所以实际上也借助了锁 (sync.Mutex)
哪些数据类型是并发安全的?
Go一共有27种细分数据类型,利用反射,探究Go语言中的数据类型
除channel外,一般情况下,byte,bool,int,float,point,func是并发安全的
(这些数据类型的位宽不会超过64位,所以在64位的指令集架构中可以由一条机器指令完成,不存在被细分为更小的操作单位,故而这些类型的并发赋值是安全的;
但也和操作系统的位数有关,如int64在32位操作系统中,高32位和低32位是分开赋值的,此时是非并发安全的)
complex,string,struct,数组,slice,map,interface,往往是并发不安全的
原文链接: https://dashen.tech/2019/01/19/golang之channel并发访问/
版权声明: 转载请注明出处.