直感に基づく答え
リクエストスコープはスレッドセーフであるため、スレッドセーフであると思います(ユーザーは複数のブラウザーセッションを開いて同じセッションIDを使用できるため、セッション以上はそうではありません)
経験的な証拠ですが、私はそれをテストしましたが、注入されたものHttpRequestProducer
はリクエストごとに新しいインスタンスを取得します。
requestInitialized
と は異なるスレッドになる可能性がある (そして実際には異なるスレッドである)ことに注意してくださいrequestDestroyed
。したがって、両方のメソッドで同じ注入されたオブジェクトを使用する場合は、さらに調査します。
仕様に裏付けられた回答
困難な部分は、仕様でこの主張の確固たる証拠を見つけることでした.
CDI 仕様を調べたところ、@RequestScoped オブジェクトがスレッド セーフであるという決定的な証拠をすぐに見つけることができませんでした (たとえば、スレッド ローカルを使用)。 (こちらをご覧ください)
そこで興味深いのが次の句です。
共有リソースへの同時アクセスの制御 マルチスレッド サーバーでは、共有リソースに同時にアクセスできます。スコープ オブジェクトの属性に加えて、共有リソースには、メモリ内データ (インスタンス変数やクラス変数など) と、ファイル、データベース接続、ネットワーク接続などの外部オブジェクトが含まれます。
同時アクセスは、いくつかの状況で発生する可能性があります。
Web コンテキストに格納されているオブジェクトにアクセスする複数の Web コンポーネント。
セッションに格納されたオブジェクトにアクセスする複数の Web コンポーネント。
インスタンス変数にアクセスする Web コンポーネント内の複数のスレッド。Web コンテナは通常、各リクエストを処理するスレッドを作成します。サーブレット インスタンスが一度に 1 つの要求のみを処理するようにしたい場合、サーブレットは SingleThreadModel インターフェイスを実装できます。サーブレットがこのインターフェースを実装する場合、サーブレットのサービス メソッドで 2 つのスレッドが同時に実行されないことが保証されます。Web コンテナは、サーブレットの 1 つのインスタンスへのアクセスを同期するか、Web コンポーネント インスタンスのプールを維持し、それぞれの新しい要求をフリー インスタンスにディスパッチすることによって、この保証を実装できます。このインターフェースは、Web コンポーネントが静的クラス変数や外部オブジェクトなどの共有リソースにアクセスすることに起因する同期の問題を防止しません。さらに、Servlet 2.
したがって、理論的には、オブジェクト自体はリクエスト スレッドごとに 1 つのインスタンスを持つように見えますが、これがサポートされているという確固たる証拠は見つかりませんでした。