何时使用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 底层结构的文章,含动图,很值得学习:传送门~


      目录
      打赏
      0
      0
      0
      0
      2
      分享
      相关文章
      温暖接力:“追星星的AI”再出发,志愿者招募令!
      孤独症儿童绘本创作工具二期迭代开发,缺人!
      195 21
      温暖接力:“追星星的AI”再出发,志愿者招募令!
      2024年 | 8月云大使推广奖励规则
      ①【近期云大使规则升级】提升首购后订单返利比例、新增沉睡用户返利 、上线企业云大使提现功能、增加返利订单类目、优化推广奖励限制。②推荐企业认证新用户首购最高奖励45%。
      HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
      HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
      1533 0
      HTTP1.0、HTTP1.1 、HTTP2.0和HTTP3.0 的区别【面试题】
      掌握Go语言正则表达式:regexp包全面解析
      掌握Go语言正则表达式:regexp包全面解析
      334 0
      Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
      Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
      4645 0
      Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
      如何重置MySQL数据库的root用户密码
      如何重置MySQL数据库的root用户密码
      248 0
      cassandra使用场景判断:何时使用及何时不用
      介绍 我有一个具有以下功能的数据库服务器: 高可用设计。 可以全球分布。 允许应用程序随时随地写入任何节点。 只需向群集添加更多节点即可进行线性扩展。 自动负载及数据均衡。 一种看起来很像SQL的查询语言。
      9145 1
      利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?
      利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?
      622 0
      利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?
      AI助理

      你好,我是AI助理

      可以解答问题、推荐解决方案等

      登录插画

      登录以查看您的控制台资源

      管理云资源
      状态一览
      快捷访问