今天,小伙伴突然问到了Servlet是不是线程安全的问题。脑子当时一卡壳,只想到了单实例多线程。这里做一些总结。
Servlet体系是建立在Java多线程的基础之上的,它的生命周期是由Tomcat来维护的。当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。
Servlet线程池
serlvet采用多线程来处理多个请求同时访问,Tomcat容器维护了一个线程池来服务请求。
线程池实际上是等待执行代码的一组线程叫做工作组线程(Worker Thread),Tomcat容器使用一个
调度线程来管理工作组线程(Dispatcher Thead)。
当容器收到一个Servlet请求,Dispatcher线程从线程池中选出一个工作组线程,将请求传递
给该线程,然后由该线程来执行Servlet的service方法。
当这个线程正在执行的时候,容器收到另一个请求,调度者线程将从线程池中选出另外一个
工作组线程来服务则个新的请求,容器并不关心这个请求是否访问的是同一个Servlet还是另一个
Servlet。当容器收到对同一个Servlet的多个请求的时候,那这个servlet的service方法将在多线程
中并发的执行。
Servlet线程安全问