朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

31 | 图解Channel:如何理解它的CSP通信模型?

你好,我是朱涛。今天我们来分析 Channel 的源码。
Kotlin 的 Channel 是一个非常重要的组件,在它出现之前,协程之间很难进行通信,有了它以后,协程之间的通信就轻而易举了。在第 22 讲当中,我们甚至还借助 Channel 实现的 Actor 做到了并发安全。
那么总的来说,Channel 是热的,同时它还是一个线程安全的数据管道。而由于 Channel 具有线程安全的特性,因此,它最常见的用法,就是建立 CSP 通信模型(Communicating Sequential Processes)。
不过你可能会觉得,CSP 太抽象了不好理解,但其实,这个通信模型我们在第 22 讲里就接触过了。当时我们虽然是通过 Actor 来实现的,但却是把它当作 CSP 在用,它们两者的差异其实很小。
00:00 / 00:00
    1.0x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00
    关于CSP 的理论,它的精确定义其实比较复杂,不过它的核心理念用一句话就可以概括:不要共享内存来通信;而是要用通信来共享内存(Don’t communicate by sharing memory; share memory by communicating)。
    可是,我们为什么可以通过 Channel 实现 CSP 通信模型呢?这背后的技术细节,则需要我们通过源码来发掘了。
    确认放弃笔记?
    放弃后所记笔记将不保留。
    新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
    批量公开的笔记不会为你同步至部落
    公开
    同步至部落
    取消
    完成
    0/2000
    荧光笔
    直线
    曲线
    笔记
    复制
    AI
    • 深入了解
    • 翻译
      • 英语
      • 中文简体
      • 中文繁体
      • 法语
      • 德语
      • 日语
      • 韩语
      • 俄语
      • 西班牙语
      • 阿拉伯语
    • 解释
    • 总结

    本文深入探讨了Kotlin的Channel组件,重点分析了其CSP通信模型和源码实现。文章首先强调了Channel在协程通信中的重要性和线程安全特性,以及CSP通信模型的核心理念。通过对Channel的创建逻辑和底层数据结构LockFreeLinkedList的源码分析,阐述了其实现原理和核心思想。LockFreeLinkedList作为循环双向链表,为Channel提供了先进先出单向队列的同时,实现了队尾添加操作,具有较低的时间复杂度。文章还详细分析了Channel的send()、receive()流程,展示了其在CSP通信模型中的作用。总结指出,通过深入了解Channel的实现细节,读者可以更好地理解其支持CSP通信模型的特点,为读者提供了一次深入的技术探索。文章内容涵盖了Channel的重要性、CSP通信模型、LockFreeLinkedList的实现原理以及send()、receive()流程的分析,为读者提供了全面的技术视角。

    仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
    《朱涛 · Kotlin 编程第一课》
    新⼈⾸单¥59
    立即购买
    登录 后留言

    全部留言(3)

    • 最新
    • 精选
    • Paul Shan
      思考题:LinkedListChannel.offerInternal调用AbstractSendChannel.offerInternal 失败的时候,会把发送的内容持续放到队列中,这样即使接受方没准备好或者不存在,发送方也不会等待,而持续进入可以接收数据并发送的状态。LinkedListChannel.offerSelectInternal调用AbstractSendChannel.offerSelectInternal失败的时候,还是会继续尝试调用这个方法,因为LinkedListChannel只要内存允许,会时刻处于接受数据的状态。

      作者回复: 很棒的答案~推荐给大家。

      2022-04-04
      9
    • EdisonLi
      要是能开辟一篇实际工作业务场景的使用就更好了。

      作者回复: 嗯……记下了,后续会考虑的。感谢建议。

      2022-05-08
      4
    • ACE_Killer09
      java 阻塞队列 的感觉

      作者回复: 是的,它们的行为模式非常类似,只是Java的是阻塞的,Channel是挂起的。

      2022-04-18
      2
    收起评论
    显示
    设置
    留言
    3
    收藏
    沉浸
    阅读
    分享
    手机端
    快捷键
    回顶部