27

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

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

4

5 に答える 5

15

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

以下も参照してください。

于 2012-12-08T10:50:19.553 に答える
6

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

于 2012-12-08T10:50:22.410 に答える
6

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

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

于 2012-12-09T03:16:01.363 に答える
0

Spring では、すべてのリクエストが別のスレッドで作成されます。たとえば、「searchRecord」スレッドおよび「insertRecord」スレッドと呼ぶことができます。どちらもヒープ内で同じオブジェクトを見つけますが、各スレッドは独自の実行スタックを作成します。

于 2021-09-20T00:49:31.967 に答える