慕容囧囧
2018-03-15 16:34
采纳率: 25%
浏览 2.3k
已采纳

不同的客户端去请求Servlet,该Servlet是同一个实例化对象还是不同的实例化对象?

问题:不同的客户端去请求Servlet,该Servlet是同一个实例化对象还是不同的实例化对象?(即,是每次请求Servlet都会实例化一个该Servlet对象,还是每次请求都使用的是同一个Servlet对象?)
难道Servlet是单例模式吗?请大家帮我解惑下!不吝赐教,谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • 马提斯亚胡 2018-03-16 08:16
    已采纳

    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对象来响应该请求;

    点赞 打赏 评论
  • zyw658000 2018-03-15 18:45

    servlet:服务端的小组件,处理一些业务。
    servlet都用到的是一个默认无参的构造方法。
    在初始化的时候不需要什么要求。
    其实是满足单例设计模式的。
    再者说,servlet都实现了一个service的抽象方法来处理业务。
    使用同一个方法就可以搞定,创建多少对象意义不大吧。。。
    一个客户端启动一个线程。
    谁调用它,就由谁给这个方法传自己实例化的请求和响应对象就好了。
    如果您还嫌不够严谨,您还可以来个并发锁。
    只要原理上不冲突,您想咋整就咋整。
    一切规则自己定(JAVA思路)。
    当然最大的优点,我感觉还是您不用实例化那么多没用的对象了

    点赞 打赏 评论
  • k_an_ke 2018-03-15 23:27

    写个类属性,每次请求都输出下值,再改变值。看看是不是同一个实例化对象。然后再考虑servlet周期,同时多个客户端请求、多次请求。

    点赞 打赏 评论
  • 龙图腾之祥龙 2018-03-16 01:27

    “Servlet”为单例对象,简单的说,如果是多例,上千万的请求服务器也承受不住!

    点赞 打赏 评论
  • zhengwen_quan 2018-03-16 02:42

    每个servlet都是新的,你请教一次就是创建一个新的出来了。望采纳。

    点赞 打赏 评论
  • 慕容囧囧 2018-03-17 11:50

    servlet中避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来操作它,照成数据的不一致,因此产生线程安全问题,写个类属性,每次请求都输出下值,再改变值。看看是不是同一个实例化对象。然后再考虑servlet周期,同时多个客户端请求、多次请求。

    点赞 打赏 评论

相关推荐 更多相似问题