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
关于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
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- Paul Shan思考题:LinkedListChannel.offerInternal调用AbstractSendChannel.offerInternal 失败的时候,会把发送的内容持续放到队列中,这样即使接受方没准备好或者不存在,发送方也不会等待,而持续进入可以接收数据并发送的状态。LinkedListChannel.offerSelectInternal调用AbstractSendChannel.offerSelectInternal失败的时候,还是会继续尝试调用这个方法,因为LinkedListChannel只要内存允许,会时刻处于接受数据的状态。
作者回复: 很棒的答案~推荐给大家。
2022-04-049 - EdisonLi要是能开辟一篇实际工作业务场景的使用就更好了。
作者回复: 嗯……记下了,后续会考虑的。感谢建议。
2022-05-084 - ACE_Killer09java 阻塞队列 的感觉
作者回复: 是的,它们的行为模式非常类似,只是Java的是阻塞的,Channel是挂起的。
2022-04-182
收起评论