servlet容器如何实例化servlet使用的外部类?

时间:2016-09-27 16:46:24

标签: java multithreading tomcat servlets

我知道多个线程共享一个Servlet实例来处理并发请求。在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是否有任何"魔法"尽可能重用线程安全实例?

1 个答案:

答案 0 :(得分:1)

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