Channel 本质上是一个 MessageQueue
Golang的核心思想是: 不要通过共享内存来通信,我们应该通过通信来共享内存 。
场景:
Channel 主要适用于有数据流动/传递的通讯场合;Mutex 则适用于数据稳定的场景。当只需锁定少量共享资源时,使用 Mutex 非常有用。
性能:
Channel 与 Mutex 相比,Channel 的使用成本更高,性能更低 。原因如下:
- Channel 内部实现包含Mutex,本身属于共享变量。
- Channel 内部实现包含条件变量(比如饥饿模式中的 "唤醒" 信号量,用于唤醒沉睡阻塞状态的goroutine)
- Channel 会使得当前的 Goroutine 让出 cpu 给另一个 Goroutine 获得执行机会,这个上下文的切换周期不低,至少远高于 Mutex 检查竞争状态的成本 ( 后者通常只是一个原子操作 )
复杂性:
Channel 对于 Mutex 的使用更为复杂些
总之:
- 不要把 Channel 当做万金油,该 Mutex 还是要用Mutex.
- 另外还有一篇大佬介绍Channel 底层结构的文章,含动图,很值得学习:传送门~