知识卡片

协程通过编译期状态机实现挂起

专业/工作 · 74

内容

Kotlin协程完全靠编译技术实现,不依赖虚拟机或操作系统支持:每个挂起函数被编译器转换成状态机,状态对应各个挂起点;挂起前,下一状态与相关局部变量被存进编译器生成类的字段中,恢复时从对应状态继续执行。这本质是经典的延续传递风格(Continuation-passing style),挂起的协程本身就是可存储、可传递的延续对象。协程挂起”几乎无代价”的关键在于它不做线程切换或系统调用,只是把执行状态存成一个普通对象,恢复也只是一次普通函数调用,而非像阻塞线程那样等待系统调度。

参考来源

《Kotlin开发快速入门与实战》第4章《Kotlin函数》