【问题标题】:How servlets container instantiates external classes used by servlets?servlet 容器如何实例化 servlet 使用的外部类?
【发布时间】:2016-09-27 16:46:24
【问题描述】:

我知道一个 Servlets 实例由多个线程共享以处理并发请求。在 servlet 内部,我将调用其他 线程安全类ExternalClassOne,而后者又调用 ExternalClassTwo

public class MyServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ExternalClassOne cOne = new ExternalClassOne();
    cOne.doSomething();     
   //doSomething() will also use other classes like ExternalClassTwo, ExternalClassThree...
  }
}

我有一些问题:

  1. 将创建多少类ExternalClassOneExternalClassTwo 的实例?
  2. 如果它们是为每个请求的每个线程创建的(例如,100 个并发请求 = 100 个 ExternalClassOne 实例),那么将它们设为单例是否会提高性能? Tomcat 是否有任何“魔力”可以在可能的情况下重用线程安全实例?

【问题讨论】:

  • 每次执行new ExternalClassOne(),都会创建一个新实例。这就是new 的目的。 Tomcat 与此无关,也无法控制任何事情:new 创建一个实例,无论您的环境是什么。

标签: java multithreading tomcat servlets


【解决方案1】:

实例是在每次执行new 时创建的,如上面的评论中所述。 小心单例:获取实例需要同步方法调用,这会破坏应用程序的响应能力。 Tomcat没有提供任何这样的方法afaik,而是Java库。您可以使用 ThreadLocals。 否则,在应用程序启动时在 ContextListener 中创建(线程安全)类并将它们放在应用程序上下文中,以便每个 servlet 可以从那里获取它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多