web-dev-qa-db-ja.com

シングルトンBeanは同時リクエストをどのように処理しますか?

シングルトンBeanが並行リクエストをどのように詳細に処理するかについて質問があります。

この質問に関してStackOverflowで検索しました。これはサンプル stackoverflowからのリンク ですが、高レベルの詳細しか見つかりませんでした。シングルトンBeanが同時リクエストを処理する方法と、システムプロセッサがそれらのリクエストをどのように見るかについての詳細を知りたい。

私は、システムプロセッサオンラインでの同時要求処理について調査しました。彼らは、プロセッサ自体にスケジューラがあり、そのスケジューラがどのリクエストを処理するかを決定すると言いました。

いいよ。複数のコアプロセッサがある場合、スケジューラは同時要求をどのように処理しますか?

誰もがシングルトンBeanがJVMとシステムで同時リクエストを処理する方法についての段階的なプロセスを説明できますか?

具体例を挙げて説明します。 Sportsのようなクラスがあります:

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

2つの要求が着信します。最初の要求は、playFootballクラスの作成されたシングルトンインスタンスでSportsメソッドを実行しています。同時に、別のリクエストがクラスplayVolleyBallの同じ作成されたシングルトンインスタンスでSportsメソッドを実行しています。

シングルトンインスタンスではどのように可能ですか?

46
saravanakumar

サラバン・クマール、

あなたの質問の背後にある動機を理解しています。コンパイラの作業を始める前に、Java Virtual Machine。

まず、あなたの質問に感心しました。質問を解決するには、いくつかの区別と理解のポイントが必要です。まず、シングルトンパターン、またはアンチパターンと呼ばれることもありますが、JVM(Java Virtual Machine)で利用できるこのクラスのインスタンスは1つだけです。これは、本質的にアプリケーションにグローバル状態を導入していることを意味します。あなたはこれを理解していることを知っていますが、それは明確化のポイントにすぎません。

今内部。

クラスのインスタンスを作成すると、JVMの共有メモリに存在するオブジェクトが作成されます。現在、これらのスレッドは、これらのインスタンスで動作するコードを独立して実行しています。各スレッドには、すべてのスレッド間で共有されるメインメモリからのデータを保持する作業メモリがあります。これは、作成したシングルトンオブジェクトへの参照が存在する場所です。本質的に何が起こっているのかは、生成され、作成したシングルトンオブジェクトを表すバイトコードがこれらのスレッドのそれぞれで実行されていることです。

これがどのように発生するかの内部は次のとおりです。

各JVMスレッドには、スレッドと同時に作成されたプライベートJVMスタックがあります。現在、JVMにはすべてのJVMスレッド間で共有されるヒープがあります。ヒープは、すべてのクラスインスタンスおよび配列のメモリが割り当てられるランタイムデータ領域です。ヒープはVM起動時に作成されます。スレッドがシングルトンインスタンスを要求すると、このシングルトンのバイトコードが存在するヒープ内の参照をポイントします。適切なコードを実行します。あなたのケースでは、最初のリクエストに対して最初のメソッドを実行し、2番目のリクエストに対して2番目のメソッドを実行します。シングルトンクラスがJava Virtual Machineに課す唯一の制限は、このクラスのヒープにインスタンスを1つだけ持つことができるということです。それは、それ以外は、メソッドから100x回参照できますが、コンパイラは同じバイトコードを指し、それを実行するだけです。これが、Singletonクラスをステートレスにしたい理由です。それにアクセスし、内部変数が変更されることを望まない同時実行制御の欠如の使用。

ご質問がある場合はお知らせください!

83
Devarsh Desai

理想的なシングルトンBeanは、状態を保持すべきではありません。つまり、処理しているリクエストに固有の何かを保存する変数はありません。

したがって、シングルトンBeanには、同時実行性の問題なしに、複数の要求に対して同時に実行できるステートレスコード(コントローラーメソッドなど)が単純にあります。

たとえば、シングルトンBeanが次の場合:

@Service
public class Calculator {

   public int sum(int a, int b) {
        return a + b;
   } 

}

簡単に言えば、2つの「要求」がBeanのsumメソッドを同時に呼び出した場合、それはsumメソッドが2つの異なるスレッドで同時に実行されることを意味します。したがって、それらは互いに重複しない独自の実行コンテキストを持ちます。これにより、安全に同時に実行できます。

同じBeanの状態が次の場合:

@Service
public class Calculator {

   int incrementalMultiplier = 0;

   public int mulitply(int a, int b) {
        incrementalMultiplier++;
        return a * b * incrementalMultiplier;
   } 

}

incrementalMultiplierは2つの要求(スレッド)で共有されるオブジェクトレベルの状態であるため、2つの要求を同時に処理するときに問題が発生する可能性があり、予期しない結果が生じる可能性があります。

要するに、ステートレスシングルトンは、2つのリクエストを同時に処理できます。これは、スレッドが異なるため

19
Varun Phadnis

共有シングルトンBeanをステートレスに保つための多くの警告を見てきましたが、WebアプリバッキングBeanのステートフルシングルトンが意味をなすユースケースを提示したかったのです。

必要に応じて、2つの個別のシステム(CRMとDigital Assets Manager-DAM)にユーザーデータを照会し、レコードを比較し、APIを使用してDAMを更新する管理Webアプリがあります。更新が多い場合、これには非常に長い時間がかかることがあります。 Web UIは更新のステータスをリアルタイムで表示します。ブラウザがajaxを使用してバッキングBeanをポーリングし、進行状況バーと処理されたユーザーアカウントの数を表示するためです。 UIには、同期プロセスを開始するボタンと停止するボタンもあります。同期ボタンは最初は有効になっており、停止ボタンはレンダリングされません。ユーザーが開始ボタンをクリックすると、開始ボタンが無効になり、停止ボタンが有効になります。

同期がアクティブになっている間、異なるクライアント(異なるブラウザーでWebアプリを使用するキーボードの異なるユーザー)に同じ状態、つまり、進行状況バーと処理されたユーザーアカウントの数、ボタンの状態を表示させます。これは、2番目の同期プロセスが既に進行中のときに2番目の同期プロセスを開始する意味がないため、重要です。

2
snakedog

詳細を知るにはシングルトンBeanはどのように同時リクエストを処理しますか? Spring Beansについて次のことを知っておく必要があります

  • Beanスコープ

    SpringにはさまざまなBeanスコープ(プロトタイプ、シングルトンなど)がありますが、これらのスコープはすべて、Beanの作成時に適用されます。たとえば、「プロトタイプ」スコープBeanは、このBeanが「注入」されるたびに作成されます。一方、「シングルトン」スコープBeanは一度作成され、アプリケーションコンテキスト内で共有されます。
    「シングルトン」スコープは、Spring Beanのデフォルトスコープです。

  • Beanの作成

    Spring Beanのライフサイクル全体は、Spring Container(つまりApplicationContext/BeanFacotry)によって管理されます。SpringContainerは、Bean定義(つまり、XMLベースまたは注釈ベース)を内部的に参照して、そのBean定義で定義されたクラスの実際のインスタンスを作成します。これで、Spring Containerの開始時にBean定義が参照され、定義されたすべてのBeanがインスタンス化されます。

  • Beanをリクエストします。

    オブジェクトがBeanにリクエストを行うと、Spring Containerはすでに初期化されたBeanを引き継ぎます。

  • Spring Bean Scope

  • Springオブジェクトはスレッドセーフですか?

  • Springチュートリアル11-Beanスコープについて

これがあなたを助けることを願っています...

1
Ashish Jagtap