Guice を使用していますが、質問があります。シングルトンのサーブレットがあります。JVM にこのクラスのインスタンスが 1 つしかないのか、それともセッション スコープのインスタンスが 1 つしかないのか? そして、このクラスへの同時アクセスはどうなるでしょうか?
3 に答える
実際、Guiceはシングルトンとして管理するサーブレットを必要とします。
注: すべてのサーブレット (またはフィルター) は @Singleton である必要があります。クラスに直接注釈を付けることができない場合は、filter() または servlet() ルールとは別に bind(..).in(Singleton.class) を使用してバインドする必要があります。他のスコープでのマッピングはエラーです。これは、サーブレット仕様との一貫性を維持するためです。Guice サーブレットは非推奨の SingleThreadModel をサポートしていません。
(このドキュメントから)
同時アクセスを正しく処理する責任があります。
サーブレット リソースの同時実行アクセスに問題がある可能性があります。サーブレットコンテナはそれを適切に処理し、リクエストごとに新しいスレッドを生成し、そのサーブレット参照を渡し、リクエストが処理されます。
また、単一のメモリ空間の使用を確認するサーブレットをシングル スレッドにすることをお勧めします。これにより、コンテナが軽量になります。デフォルトですべての Bean がシングルトンである春に利用できる同じ概念。
Guice についてはよくわかりませんが、コンテナは、サーブレットが悪を実装しない限り、仕様に従って、DD の定義ごとに JVM ごとにサーブレットのインスタンスが 1 つだけ存在するようにしSingleThreadModel
ます。request
コンテナは、メソッドを呼び出して、それぞれに対して新しいスレッドを生成しますservice()
。
さらに、クラス変数とインスタンス変数はスレッドセーフではありません。ローカル変数のみがスレッドセーフになります。