我正在尝试创建一个类似服务的简单应用程序。我使用浏览器作为入口点,servlet作为请求的接收者和几个辅助java类。例如,我让用户A
与用户B
同时使用该应用程序。
现在我的问题是,当多个用户访问服务时,帮助程序类会发生什么?每次用户使用该应用程序时,它们都会被实例化吗? 5个用户,他们(帮助者类)是否实例化了5次,或者对于所有用户,只有一个副本?
答案 0 :(得分:2)
这取决于您实例化这些POJO的时间和地点。如果要在doGet或doPost上实例化它们,则在每个请求上创建这些对象的新实例(并在响应请求后丢弃它们)。现在,如果您将它们“延迟实例化”到更长的内存范围(会话等),那么您可以将它们保留更长时间(例如,对于会话范围,在会话的整个生命周期内)。
答案 1 :(得分:1)
一个简单的答案是,无论何时使用new YourClasseName()
,都要实例化一个新对象。
由于servlet容器为每个单个servlet的新请求分配一个线程(除非你做了某些特殊的更改),然后简单地说,5个users = 5个threads = 5个调用来构建你的pojos。意味着你的对象被实例化了5次。
答案 2 :(得分:1)
我认为你需要先回过头来了解一下java实例化及其生命周期。并且要更具体地说明您的情况,请提供代码段。这取决于你如何实例化助手类,我能想到的3种可能性:
1-常规助手类
在这种情况下,您只需调用Helper h = new Helper();
,然后只需在助手类h.doHelp(param)
上调用操作 - 每次Servlet调用它时,它都会创建Helper
类的新实例。除非您的助手类使用任何静态变量。
2 - 单身人士
当您将Helper类实现为Singleton并且您的Servlet以Singleton的方式调用它时,例如Helper h = Helper.getInstance()
如果您这样做,那么对Servlet的每个请求都共享Hepler类的相同实例
3 - 静态类
如果您的助手类只使用静态方法,例如。 Helper.doHelp(param);
然后在不同的请求之间也没有共享,除非你的助手类使用任何静态变量。
答案 3 :(得分:1)
你的帮助程序类应该是单例,这样userA和userB都将使用相同的实例而不是实例化两次。