golang之channel并发访问


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,往往是并发不安全的

关于go的并发安全

文章目录