有栈协程对于Java的意义
有栈协程对于Java的意义
1.传统 Servlet 生态的线程模型
在传统的 servlet 生态中,线程模型一般是 thread per request,即每个请求分配一个线程,这个线程负责整个请求的生命周期。
有个很直观的媒介:ThreadLocal–在一次请求过程中,可以在请求上游往 ThreadLocal set 一些数据,比如可以存 userId、trace 等;在请求下游时直接调用 threadLocal.get() 即可获取。
在这种线程模型中,想要承载更多请求,就需要添加更多线程。Java 平台线程由 JVM 映射到操作系统的内核线程,如果并发请求数量增多,内核线程就需要同样增加,过多的内核线程会导致频繁的线程上下文切换,如果存在阻塞的IO操作,就会导致大量内核线程被阻塞,浪费内存资源用于无意义的存储线程栈和线程控制块。
一个内核线程的成本大小?
2.响应式线程模型
为了避免创建和阻塞过多的内核线程,我们需要一种方式提高线程利用率:当遇到某些阻塞IO操作,将线程迁移走以执行其他任务。
事实上已经有很多框架提供了这部分能力,例如 Netty、Vert.x、Quarkus。
3.
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.