问题:不同的客户端去请求Servlet,该Servlet是同一个实例化对象还是不同的实例化对象?(即,是每次请求Servlet都会实例化一个该Servlet对象,还是每次请求都使用的是同一个Servlet对象?)
难道Servlet是单例模式吗?请大家帮我解惑下!不吝赐教,谢谢!
Servlet容器默认是采用单实例多线程的方式处理多个请求的:
1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的设置线程池中线程数目,初始化线程池通过web.xml,初始化每个参数值等等。
3.当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
4.线程执行Servlet的service方法;
5.请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题)
从上面可以看出:
第一:Servlet单实例,减少了产生servlet的开销;
第二:通过线程池来响应多个请求,提高了请求的响应时间;
第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求;
servlet:服务端的小组件,处理一些业务。
servlet都用到的是一个默认无参的构造方法。
在初始化的时候不需要什么要求。
其实是满足单例设计模式的。
再者说,servlet都实现了一个service的抽象方法来处理业务。
使用同一个方法就可以搞定,创建多少对象意义不大吧。。。
一个客户端启动一个线程。
谁调用它,就由谁给这个方法传自己实例化的请求和响应对象就好了。
如果您还嫌不够严谨,您还可以来个并发锁。
只要原理上不冲突,您想咋整就咋整。
一切规则自己定(JAVA思路)。
当然最大的优点,我感觉还是您不用实例化那么多没用的对象了
写个类属性,每次请求都输出下值,再改变值。看看是不是同一个实例化对象。然后再考虑servlet周期,同时多个客户端请求、多次请求。
“Servlet”为单例对象,简单的说,如果是多例,上千万的请求服务器也承受不住!
servlet中避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题,写个类属性,每次请求都输出下值,再改变值。看看是不是同一个实例化对象。然后再考虑servlet周期,同时多个客户端请求、多次请求。
每个servlet都是新的,你请教一次就是创建一个新的出来了。望采纳。