前面几节把协程的机制讲完了,这一节回到一个最容易被误解的地方:协程到底比线程快多少。面试里问"协程和线程的性能区别",十个人里有八个会答"协程更轻量,所以更快"——这句话半对半错,说错的那一半正是这一题要考的坑。先把结论放在前面:协程的"轻量"体现在创建与切换成本上,不体现在"单个任务跑得更快"上。协程的创建是分配一个对象 + 一次状态机初始化,切换发生在用户态——编译器把suspend点的状态写进 continuation 对象,恢复时读回来,全程不进内核、不做上下文切换、不刷新 CPU 缓存。线程切换则要走内核调度、切换栈与寄存器上下文。数量级上,线程切换在微秒级(甚至更高,受核数与负载影响),协程切换在纳秒级。但如果任务本身是阻塞的,协程一点忙都帮不上——这是最大的坑。机制背后的执行路径关键的区分是"协程"和"线程"不是同一层的东西。线程是 CPU 调度单位,协程是用户态的挂起单元。一个线程上可以跑成百上千个协程,协程被挂起时只是让出线程使用权,线程本身可以去跑别的协程。再看阻塞这件事。假设Dispatchers.IO线程池大小是 64(默认max(64, 核数)),你启动 100 个协程,每个都调Thread.sleep(1000):用线程:100 个线程(超出池大小的排队),系统线程数暴涨、内存涨、上下文切换