サーブレットへのリクエストごとに、doPost()メソッドまたはdoGet()メソッドが実行され、initしかし、これらの方法の外に書かれたコードはどうですか?
このコードもスレッド化されていますか?その部分で宣言された変数は、doPost()
で変更されていれば、その変更は他の要求に対してサーブレットに反映されますか?サーブレット内のinit()メソッドの外側で宣言された変数
答えて
通常のサーブレット・コンテナでは、サーブレット・オブジェクトのインスタンスは1つのみです。このオブジェクトは任意の数のスレッド(要求ごとに1つのスレッド)で使用できます。サーブレットインスタンスのライフタイムの管理は、サーブレットコンテナに依存します。
したがって、どのメソッド(init()も含む)でクラス変数の値を変更すると、後続のすべての要求に影響します。 メソッド内のローカル変数を変更または宣言しても、次回メソッドが呼び出されるときにローカル変数が再度作成されるため、何も影響しません(メソッドが終了するとガベージコレクタによって破棄されます)。
デフオルトサーブレットはスレッドセーフではありません。多くのクライアントに対して、単一のサーブレットインスタンスが呼び出されます。状態をサーブレットの内部にインスタンス変数として格納するのは間違いです。
参照:
サーブレットインスタンスがコンテナによってプールされます。したがって、実世界のシナリオでは、任意の数のスレッドで任意の数のサーブレットオブジェクトを共有できます。すべてのdoXXX()メソッドおよびそれらから呼び出される他のメソッドは、スレッドによって共有されます。
したがって、サーブレットではクラスレベルの変数(状態を維持するため)を持つことをお勧めします。確かにConstants、Staticヘルパメソッドと静的変数を持つことはできますが、インスタンスによって共有され、サーブレットを使用するクライアントによって絶えず変更されることはありません。
しかし、物事はお勧めしませんが、変数/メソッドを同期させることを止めることはありません。これにより、一度に1つのスレッドだけがリソースにアクセスすることが保証されますが、スレッドがロックを占有する前に他のスレッドがリソースを解放するのを待たなければならないため、パフォーマンス上のペナルティが発生します。
しかし、より良い方法があります。サーブレットで状態を維持し、クライアントごとに変数を格納したい場合、サーブレットはjavax.servlet.SingleThreadModel
を実装する必要があります。サーブレットがこのマーカーインターフェイスを実装している場合、コンテナは状態を維持しているため、インスタンスごとに1つのスレッドしか提供されません。
- 1. ループ内で宣言された変数
- 2. サーブレットで宣言されたメソッドはスレッドセーフであるか、サーブレットのローカル変数はスレッドセーフです
- 3. Java - 外部からループ内で宣言された変数
- 4. whileループの外で宣言された変数は、スカラのwhileループの内側ではアクセスできません。
- 5. メソッドの外側に宣言されたJava参照変数は、スタックまたはヒープ上にあります。
- 6. Javascriptスコープ:forEachループの外側ではなく内部で宣言された変数
- 7. スイッチ:宣言された変数外のスイッチとそれに
- 8. 関数の先頭で宣言された変数と後で宣言された変数の差
- 9. クラス内の関数内で宣言された変数へのアクセス(PHP)
- 10. 宣言された変数へのデータベース
- 11. ルールファイル内で宣言された型のメソッドの定義
- 12. C++メソッド変数宣言
- 13. PHP関数の外部で宣言された変数へのアクセス
- 14. メソッド宣言の例外。 JAXB
- 15. C++のクライアント側でDLLで宣言されたメソッドを実装する方法
- 16. Whileループは変数の宣言がループの外側で行われたときにコンピュータをハングさせます
- 17. MPMediaItemArtworkの変数宣言(INITは()は使用できません)
- 18. メソッド宣言の保護されたパラメータ?
- 19. アクセス親のinitメソッドで定義されたの変数
- 20. 関数内で宣言された静的変数の値は何ですか?
- 21. 不正な引数の例外 - メソッドで定義された静的変数を宣言する方法
- 22. 関数内で宣言された関数のスコープ
- 23. 匿名関数内で宣言された関数へのアクセス?
- 24. Javascript変数のスコープ内で宣言されていない
- 25. 宣言された変数とjs関数の宣言されていない変数
- 26. メソッドで宣言された変数とクラス変数として宣言されたフィールドの違いは何ですか?
- 27. mixin宣言の内側から変数を添付されたコンテンツブロックに渡しますか? Rubyでは
- 28. C++のメソッド定義と変数宣言
- 29. C - 宣言時の宣言されていない変数
- 30. クラス宣言でconstメンバー変数が初期化されたときの例外
javax.servlet.SingleThreadModelは推奨されていません。 –