2016-09-27 5 views
-1

私は1つのサーブレットインスタンスが同時リクエストを処理するために複数のスレッドによって共有されていることを知っています。サーブレットの中で、私は他のスレッドセーフなクラス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. 作成されますどのように多くのクラスExternalClassOneのインスタンス、ExternalClassTwo
  2. リクエストごとにスレッドごとに作成された場合(100個の同時リクエスト= 100件のExternalClassOne)、シングルトンでパフォーマンスが向上していますか?可能であれば、Tomcatはスレッドセーフなインスタンスを再利用するための "魔法"を持っていますか?
+4

'new ExternalClassOne()'が実行されるたびに、新しいインスタンスが作成されます。それが「新」の目的です。 Tomcatはそれとは関係がなく、何も制御できません。新しい環境は、あなたの環境が何であれ、インスタンスを作成します。 –

答えて

1

インスタンスは、上記のコメントで既に述べたように、newの実行ごとに作成されます。 シングルトンの使用に注意:インスタンスを取得するには、同期メソッドの呼び出しが必要です。これにより、アプリケーションの応答性が損なわれます。 Tomcatはafaikのような手段を提供していませんが、Javaライブラリです。あなたはThreadLocalsを使うことができます。 それ以外の場合は、アプリケーションの起動時にContextListenerに(スレッドセーフな)クラスを作成し、アプリケーションのコンテキストに入れて、各サーブレットがそこから取得できるようにします。

関連する問題