2012-04-21 10 views
5

ないが、なぜ、彼らは、インスタンス変数が非スレッドセーフであると言います。サーブレットでのインスタンス変数はスレッドセーフ

私はあまりこの文を理解していません。たとえば、私は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は、構造を有しているかもしれません。これらのスレッドのインスタンスは互いに分離されているためです。マルチスレッド環境でのインスタンス変数を使用する場合

どこに問題を把握してください。

感謝:)

+3

同じオブジェクトの同じメソッドを2つのスレッドから呼び出すことについて考えてみましょう。 –

+0

@DanielFischer 1)これらの変数はプライベートです2)このスレッドのオブジェクトは常に他のスレッドとは異なります(私は思います)。私は上記のサンプルコードを持っています。もっと明瞭に教えてください。 – hqt

+2

@hqt:コンテナは、サーブレットの一意のインスタンスを作成し、それをグローバルデータ構造(マップなど)に格納し、要求が到着するたびに、リクエストのパスに基づいて適切なサーブレットを取得します。マップから取得し、そのサービスメソッドを呼び出します。サーブレットのフィールドがプライベートであるという事実は影響を与えません。容器はそれらについて気にしない。 –

答えて

14

あなたが作っている間違いはここにある:すべてのこれらのスレッドが のActionServletのための新しいクラスのインスタンスを作成しますので、だから、

ので、私はここに何の問題が表示されません。 のインスタンスのため、これらのスレッドはお互いに別です。

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

ストライプアクションフレームワークは、要求ごとに新しいインスタンスを作成しますDOES、そのためには、その枠組みの下で大丈夫な仮定です。ただし、たとえば、Struts 1はサーブレットモデルに従い、要求ごとに新しいアクションを作成しません。コンテナは、単一のインスタンスに制限されていることを意味するものではありません、それは理論的には1以上のものを作成することができます

、それはとても頼りにすることはできません指定された動作ではありません。人気のあるもののほとんどはそうではありません。

+3

実際、コンテナはインスタンスを1つだけ作成しなければなりません。ああ –

+0

「分散環境(デフォルト)でホストされていないサーブレットの場合、サーブレット コンテナはサーブレット宣言ごとに1つのインスタンスのみを使用しなければなりません」:ここでは仕様が言っていることです。 @JBNizetとWill Hartungの両方に感謝します。この本では、コンテナがただ1つのサーブレットに対して1つのインスタンスを作成するだけであることはわかりません。 – hqt

0

事はあなたのaction.javaは常にインスタンス化されていないが、それは、インスタンスのプールから取られている、であるが、同じことが要求スレッドのために行く、彼らは、スレッドプールから取られていますサーブレットインスタンスは複数のリクエストで共有される可能性があります。

+4

サーブレットのインスタンスプールはありません。サーブレット宣言ごとに1つのサーブレットインスタンスしかありません。 –

2

これらすべてのスレッドが新しいクラスのインスタンス(action.java)を作成するので、私はあなたがすべてのスレッドでのみ使用されるクラスのインスタンスを作成することを想定されているすべての問題

が表示されませんその糸によって、あなたは何の問題もないのです。

しかし、同じインスタンスが二つのスレッドからアクセスされていることを、あなたの特定のサンプルと、想像してみてください。両方が同時にあなたのrequestresponseのメンバーを使用している場合はどうなりますか? 身元不明のリクエストからデータを読み取ることがあり、2つの部分が混在した矛盾した応答が書き込まれることがあります。

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

関連する問題