理解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

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。