私のWebアプリケーションはSpring IOCを使用しています。したがって、私の春の豆はすべてデフォルトでシングルトンになります。 2つのリクエストが1つのクラスの2つの異なるメソッドに同時にアクセスしようとした場合(たとえば、MySpringBean
は2つのメソッドsearchRecord
とinsertRecord
を持つクラスです)、両方の要求が同じSpring Beanに同時にアクセスします。
同じSpring Beanを両方のクライアントが同時に利用できるようにする方法、または両方のリクエストが同じSpring Beanを介して2つの異なるメソッドにアクセスしようとすると、同時実行性の問題になるでしょうか。また、春の豆はシングルトンであるため、新しいインスタンスを形成することはできません。この場合、これはどのように機能しますか?
最初に、並行性が問題を引き起こす可能性がある場合を理解する必要があります。 Spring Beanがステートレス(フィールドがない、すべてのフィールドがfinal
である、またはすべてが1回だけ割り当てられる)の場合、複数のスレッドが同じBeanまたは同じメソッドを安全に使用できます。
Beanがシングルトンの場合、Springはどのスレッドでも同じインスタンスを提供します。そのBeanをスレッドセーフにするかどうかはあなた次第です。シングルトンなので、そのクラスをステートレスにするのが最善です。
他の人がすでに示唆しているように、Springは「シングルトン」Beanの場合にすべてのスレッドに同じインスタンスを提供する予定です。
理解する必要があるのは、オブジェクトが状態と動作(コード)を提供している間に、スレッドがコードを実行することによってシステム内のすべての作業を行うことです。したがって、複数のスレッド(この場合はリクエスト)がシングルトンBeanで同じメソッドを同時に実行することは確かに可能です。 Tomaszが提案したように、このようなBeanをステートレスにするか、「スレッドセーフ」にすることができます。
Javaシングルトンとスプリングシングルトンは異なります。 Springシングルトンスコープはコンテキスト内で利用可能になります。
Javaシングルトンのスコープは、JVMクラスローダーになります。したがって、同時リクエストは春のコンテキストを通じてのみ可能です