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