8

を読むHead First Servlet and JSPと、インスタンス変数は非スレッドセーフであると書かれています。

この発言はあまり理解できません。例: という名前のサーブレットがありますActionServlet.java。各ユーザーのリクエストがサーバーに送信されるたびに、コンテナーは新しいスレッドを作成し、新しいActionServletインスタンスを作成します。

ActionServlet次の構造を持っている可能性があります。

public class ActionServlet extends HttpServlet {
   // example of instance variable
   Instance variable;
   public void processRequest(HttpServletRequest request, HttpServletResponse response) {   
       // process something relating to instance variable
   }
}

つまり、これらすべてのスレッドが の新しいクラス インスタンスを作成するためActionServlet、ここでは何の問題もありません。これらのスレッドのインスタンスは互いに独立しているためです。

マルチスレッド環境でインスタンス変数を使用する場合の問題点を突き止めてください。

ありがとう :)

4

3 に答える 3

17

あなたが犯している間違いはここにあります:

したがって、これらのスレッドはすべてActionServletの新しいクラスインスタンスを作成するため、ここでは問題は発生しません。これらのスレッドのインスタンスは互いに分離しているためです。

コンテナは、リクエストごとにServletクラスの新しいインスタンスを作成しません。既存のものを再利用します。これが、スレッドセーフではない理由です。

Stripes Action Frameworkは、リクエストごとに新しいインスタンスを作成するので、そのフレームワークでは問題ありません。ただし、たとえば、Struts 1はサーブレットモデルに従い、リクエストごとに新しいアクションを作成しません。

これは、コンテナが単一のインスタンスに制限されていることを意味するものではなく、理論的には複数のインスタンスを作成できますが、特定の動作ではないため、信頼できません。人気のあるもののほとんどはそうではありません。

于 2012-04-21T18:10:15.923 に答える
3

これらのスレッドはすべて新しいクラスインスタンス(action.java)を作成するため、問題は発生しません。

すべてのスレッドがそのスレッドでのみ使用されるクラスインスタンスを作成すると想定しているので、問題はありません。

ただし、特定のサンプルを使用して、同じインスタンスが2つのスレッドからアクセスされることを想像してみてください。requestあなたとresponseメンバーの両方が同時に使用するとどうなりますか?おそらく、識別できないリクエストからデータを読み取り、2つの部分が混在する一貫性のない応答を書き込むことになります。

したがって、あなたの場合も、インスタンス変数はスレッドセーフではありません。2つのスレッドが同じインスタンスにアクセスすると、互いに干渉する可能性があるためです。

于 2012-04-21T18:10:21.693 に答える
0

つまり、action.javaは常にインスタンス化されるわけではありませんが、インスタンスプールから取得されます。同じことがリクエストスレッドにも当てはまり、スレッドプールから取得されるため、サーブレットインスタンスは複数のリクエストで共有される可能性があります。 。

于 2012-04-21T18:09:24.503 に答える