マルチスレッドモデルでのservletのインスタンスは使い回される。

Servletのお勉強
当然の事なのだろうけど、ソースを書いて確認。

マルチスレッドモデルでのservletのインスタンスは、複数スレッドで共用される。

なので、インスタンス変数を使うと危険。

ついでに、HttpSessionも変な使い方をすると危険な事を確認。(わざわざこんな使い方はしないだろうけど・・・・)

インスタンス変数として、HttpSessionを宣言

HttpSession session = null;

以下、doGet内のコード

String result;

  if ( this.session == null) {

   result = “session is null”;
   session = req.getSession();

  } else {
   result = “session exists”;

  }

  PrintWriter writer = resp.getWriter();

  writer.println(“<html>”);
  writer.println(“<head>”);
  writer.println(“</head>”);
  writer.println(“<body>”);
  writer.println(result);
  writer.println(“<br>”);
  writer.print(“Servlet instanse ID is:”);
  writer.println(this.toString());
  writer.println(“<br>”);
  writer.print(“Session instanse ID is:”);
  writer.println(session.toString());
  writer.println(“</body>”);
  writer.println(“</html>”);

一回目のアクセス

session is null
Servlet instanse ID is:[email protected]
Session instanse ID is:[email protected]

新規セッションの別ウィンドウからアクセス

session exists
Servlet instanse ID is:[email protected]
Session instanse ID is:[email protected]

サーブレットのインスタンスが一緒。

あと、インスタンス変数なのでHttpsessionも一緒。

インスタンス変数を使う場合は要注意って感じですね。

「マルチスレッドモデルでのservletのインスタンスは使い回される。」への3件のフィードバック

  1. 自己レス。
    シングルスレッドモデルでも、プーリングされてインスタンス自体は使い回されるのね。

    シングルスレッドモデルだからといって完全にスレッドセーフではないと。
    ってかSingleThreadModelは、servlet API2.4からはdeplicatedなのね。。。。。

コメントを残す