何时使用Channel,何时使用Mutex ?

简介: 何时使用Channel,何时使用Mutex ?

 Channel 本质上是一个 MessageQueue

Golang的核心思想是: 不要通过共享内存来通信,我们应该通过通信来共享内存 。

场景:

Channel 主要适用于有数据流动/传递的通讯场合;Mutex 则适用于数据稳定的场景。当只需锁定少量共享资源时,使用 Mutex 非常有用。

性能:  

Channel 与 Mutex 相比,Channel 的使用成本更高,性能更低 。原因如下:

    1. Channel 内部实现包含Mutex,本身属于共享变量。
    2. Channel 内部实现包含条件变量(比如饥饿模式中的 "唤醒" 信号量,用于唤醒沉睡阻塞状态的goroutine)
    3. Channel 会使得当前的 Goroutine 让出 cpu 给另一个 Goroutine 获得执行机会,这个上下文的切换周期不低,至少远高于 Mutex 检查竞争状态的成本 ( 后者通常只是一个原子操作 )

    复杂性:

    Channel 对于 Mutex 的使用更为复杂些

    总之:

      • 不要把 Channel 当做万金油,该 Mutex 还是要用Mutex.
      • 另外还有一篇大佬介绍Channel 底层结构的文章,含动图,很值得学习:传送门~


      目录
      相关文章
      |
      安全 Java 调度
      多线程锁sync+lock使用,@Async使用
      多线程锁sync+lock使用,@Async使用
      多线程锁sync+lock使用,@Async使用
      queue Thread-Safe FIFO Implementation
      queue Thread-Safe FIFO Implementation
      |
      调度 C++
      C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)
      C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)
      209 0
      |
      Go 调度
      一文初探 Goroutine 与 channel
      哈喽大家好,我是陈明勇,本文介绍的内容是 Go 并发模块的两个重要角色 → goroutine 与 channel。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
      12407 0
      一文初探 Goroutine 与 channel
      |
      程序员 Go
      什么时候用Goroutine?什么时候用Channel?
      通过全局变量加锁同步来实现通讯,并不利于多个协程对全局变量的读写操作。 加锁虽然可以解决goroutine对全局变量的抢占资源问题,但是影响性能,违背了原则。 总结:为了解决上述的问题,我们可以引入channel,使用channel进行协程goroutine间的通信。
      102 0
      |
      Linux API
      pthread_mutex_init & 互斥锁pthread_mutex_t的使用
      pthread_mutex_init l         头文件: #include l         函数原型: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; l         函数作用: 该函数用于C函数的多线程编程中,互斥锁的初始化。
      1934 0
      |
      网络协议 Go
      goroutine and channel
      [TOC] 1 goroutine package main import ( "fmt" "time" ) func spinner() { for { for _, c := range `\|/` { fmt.