servlet单例多线程的理解
2017-03-15 本文已影响406人
torres9gogogo
“当web服务启动或者是请求发送到服务器的时候 servlet被加载并且实例化(只有一个实例)”
理解:
(1)一个web项目(不同的业务请求)可以实例化多个servlet,多个用户线程请求,只实例化一个servlet.
(2)servlet单实例多线程并发会有安全问题,成员对象变量线程不安全,局部变量线程安全(java对象分配至堆中线程共享,局部变量在方法栈中线程独享)。
(3)servlet 单实例减少new实例的开销。
(4)对多个请求通过分配线程池中已有的线程的方式减少响应时间。
(5)每一个请求由servletrequest 封装接受,响应结果由servletresponse封装响应。即servletrequest servletresponse线程独享。
servlet多线程机制同时处理多个请求
servlet 单实例多线程基于java多线程机制,servlet整个生命周期由servlet 容器负责(加载 实例化 初始化),容器启动时候或者第一次访问的时候 容器根据 web.xml 的配置信息实例化一个servlet.新的客户端请求的时候一般不会再去实例化新的servlet(除非servlet实现 SingleThreadModel 接口).调度线程dispatcher thread从线程池中选出一个工作者线程worker thread,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求