本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
协程是什么?
协程是线程吗?是线程池的线程?是轻量级的线程?
实际上,可以非常肯定的说,协程不是线程!
我们反过来想,如果协程是线程,那么咱们怎么让一个线程挂起呢?
那既然协程不是线程,那又为什么常说协程是轻量级的线程呢?协程轻在哪呢?
"轻量级"的线程
Kotlin中的协程经常被称为“轻量级线程”,这是相对于传统的线程模型而言的。为了更好地理解这一点,我们需要从内存占用、任务切换、JVM内存模型等多方面进行剖析。
1. 轻量级的原因
1.1 内存占用
- 线程: 每个线程在创建时分配一定数量的栈内存(默认大约1MB)。如果系统启动大量线程,则会消耗大量内存,可能导致系统资源枯竭。
- 协程: 协程是运行在现有线程中的,它们不需要单独的栈内存,而是共享调用栈。这样协程仅需要少量内存开销,通常每个协程只占用几个KB。这使得同一线程可以管理和运行大量协程,不受传统线程数量限制。
1.2 任务切换
- 线程切换: 线程切换由操作系统管理,涉及到用户态和内核态之间的切换,代价较高,需要保存和恢复CPU寄存器、程序计数器、内存栈等。
- 协程切换: 协程切换在用户态完成,不涉及内核态切换,只是切换函数的上下文,代价相对低很多。