理解Servlet的单实例多线程
一. Servlet 容器
1. Java 的内存模型 JMM(Java Memory Model)
JMM 主要是为了规定了线程和内存之间的一些关系。根据 JMM 的设计,系统存在一个主内存 (Main Memory),Java 中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存 (Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
根据 JMM,我们可以将 Servlet 实例的内存模型抽象为图所示的模型。

Servlet 采用多线程来处理多个请求同时访问。Servlet 依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet 使用一个调度线程来管理工作者线程。
当容器收到一个 Servlet 请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行 Servlet 的 service 方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个 Servlet。
当容器同时收到对同一个 Servlet 的多个请求的时候,那么这个 Servlet 的 service() 方法将在多线程中并发执行。
Servlet 容器默认采用单实例多线程的方式来处理请求,这样减少产生 Servlet 实例的开销,提升了对请求的响应时间,对于 Tomcat 可以在 server.xml 中通过 Connector 元素设置线程池中线程的数目。
2. Servlet 容器

This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content