web-dev-qa-db-ja.com

Spring Beanは並行性をどのように処理しますか

私のWebアプリケーションはSpring IOCを使用しています。したがって、私の春の豆はすべてデフォルトでシングルトンになります。 2つのリクエストが1つのクラスの2つの異なるメソッドに同時にアクセスしようとした場合(たとえば、MySpringBeanは2つのメソッドsearchRecordinsertRecordを持つクラスです)、両方の要求が同じSpring Beanに同時にアクセスします。

同じSpring Beanを両方のクライアントが同時に利用できるようにする方法、または両方のリクエストが同じSpring Beanを介して2つの異なるメソッドにアクセスしようとすると、同時実行性の問題になるでしょうか。また、春の豆はシングルトンであるため、新しいインスタンスを形成することはできません。この場合、これはどのように機能しますか?

18
Rajeev Akotkar

最初に、並行性が問題を引き起こす可能性がある場合を理解する必要があります。 Spring Beanがステートレス(フィールドがない、すべてのフィールドがfinalである、またはすべてが1回だけ割り当てられる)の場合、複数のスレッドが同じBeanまたは同じメソッドを安全に使用できます。

参照:

11

Beanがシングルトンの場合、Springはどのスレッドでも同じインスタンスを提供します。そのBeanをスレッドセーフにするかどうかはあなた次第です。シングルトンなので、そのクラスをステートレスにするのが最善です。

5
hertzsprung

他の人がすでに示唆しているように、Springは「シングルトン」Beanの場合にすべてのスレッドに同じインスタンスを提供する予定です。

理解する必要があるのは、オブジェクトが状態と動作(コード)を提供している間に、スレッドがコードを実行することによってシステム内のすべての作業を行うことです。したがって、複数のスレッド(この場合はリクエスト)がシングルトンBeanで同じメソッドを同時に実行することは確かに可能です。 Tomaszが提案したように、このようなBeanをステートレスにするか、「スレッドセーフ」にすることができます。

5
Raghuram

Javaシングルトンとスプリングシングルトンは異なります。 Springシングルトンスコープはコンテキスト内で利用可能になります。

Javaシングルトンのスコープは、JVMクラスローダーになります。したがって、同時リクエストは春のコンテキストを通じてのみ可能です

0
Mohamed Salih