Springにおける一例と複数例の理解

2859 ワード

1,何が単例と複数例の単例ですか?すべての要求は同じ対象で処理します.一例のモードによって、システムのクラスの一つが一例だけであることを保証することができる.複数例:各要求は新しいオブジェクトで処理される.
2,Springにおける単一の例と複数のspring ioc容器のbeanはデフォルトの単一の例であり、すなわちspring依存注入Beanの例はデフォルトでは単一の例である.
springは5の中でscopeを提供して、それぞれsingletonで、prototype、request、session、global session、よく使うのは前の2種類です.ここをクリックしてホームページの紹介を見ます.
一例beanと複数例beanの違い:一つのbeanが一例として宣言された場合、複数回の要求を処理する時、spring容器の中で一つのbeanだけがインスタンス化され、その後の要求はすべてこのオブジェクトを共有し、このオブジェクトは一つのmapの中に保存されます.要請があったら、まずキャッシュ(map)から確認します.ある場合は直接このオブジェクトを使って、ない場合は新しいオブジェクトを実行します.しかしプロトタイプbeanにとっては、要求が来るたびに、新しいbeanが直接的に実行され、キャッシュ及びキャッシュクエリのプロセスがない.
3、一例の優勢と劣勢優勢:新しいオブジェクトを作成しないので、以下のいくつかの性能上の利点があります.
  • は、新たな生成例の消費を低減する.新しく生成された例は、2つの態様を含み、第1に、springは、反射またはcglibによってbeanのインスタンスを生成する.これは、いずれも消費性能の動作である.第二に、オブジェクトにメモリを割り当てるのもアルゴリズムを担当します.
  • jvmのゴミ回収を減らす.各要求に対してベーンインスタンスを生成しないため、回収対象が少なくなります.
  • は、beanを素早く取得することができる.一例でbeanを取得する動作は、最初の生成以外はキャッシュから取得するので、早い.
  • 劣勢:スレッドの安全ができないという大きな欠点があります.全ての要求が一つのbeanのインスタンスを共有するので、このbeanが状態があるbeanであれば、同時シーンで問題が発生する可能性がある.
    4,spring単一の例のモードとスレッドセキュリティ:複数のユーザが同時にサービスを要求すると、各要求に対してスレッドが割り当てられ、複数のスレッドが同時にこの要求に対応するトラフィックロジック(メンバー方法)を実行します.この場合、ここではこの単例の状態に対する修正があれば注意してください.スレッド同期問題(この状態は臨界リソース(共有データ)であり、複数のスレッドが同時に動作(修正)されると、スレッドセキュリティ問題を誘発する)が考えられます.
    スレッドのセキュリティ:あなたのコードが存在するプロセスに複数のスレッドが同時に実行されている場合、これらのスレッドはこのコードを同時に実行することがあります.毎回の運行の結果が単一スレッドの運行の結果と同じであれば、他の変数の値も予想通りであり、スレッドが安全である.あるいは、クラスまたはプログラムによって提供されるインターフェースは、スレッドにとって原子的な操作またはマルチスレッド間の切り替えによって、このインターフェースの実行結果に二義性が生じることはなく、スレッドセキュリティである.
    スレッドセキュリティ問題は、グローバル変数と静的変数によって引き起こされます.各スレッドがグローバル変数に対して、静的変数は読み書きのみであり、書き込みなしで動作する場合、一般的にこのグローバル変数はスレッドが安全である.複数のスレッドが同時に書き込みを行う場合、スレッドの同期を考慮する必要があります.そうでないと、スレッドの安全に影響を与える可能性があります.
  • 定数は常にスレッドの安全であり、読み取り動作のみが存在するためである.
  • は、共有リソースにアクセスしないので、方法を起動する前に新しい例を作成する.
  • ローカル変数はスレッドセキュリティです.各方法を実行すると、独立した空間でローカル変数を作成します.共有リソースではありません.局所変数は、方法のパラメータ変数と方法内の変数を含みます.
  • springの一例とスレッドの安全に関する多くの文章では、状態beanと無状態beanという概念が言及されている.無状態bean:無状態、つまり一回の操作でデータを保存できません.無状態beanとは、インスタンス変数がないオブジェクトであり、データを保存できない、不変種類であり、スレッドで安全です.状態beanがあります.状態があれば、データ記憶機能があります.ステータスバーとは、インスタンス変数があるオブジェクトで、データを保存することができます.非スレッドセキュリティです.
    スレッドの安全問題はどう解決しますか?(1)スレッド同期機構を使用する:オブジェクトのロック機構により、同じ時間に1つのスレッドのみが変数にアクセスすることを保証する.この変数は複数のスレッドで共有されています.同期機構を使って、いつ変数を読み書きするかを綿密に分析する必要があります.いつあるオブジェクトをロックする必要がありますか?(2)ThreadLocalを使用する:各スレッドに独立した変数コピーを提供し、複数のスレッドからデータへのアクセス衝突を分離する.各スレッドは自分の変数コピーを持っているので、その変数を同期する必要はありません.
    要約すると、マルチスレッドリソース共有の問題に対して、同期機構は「時間で空間を変える」方式を採用しているが、ThreadLocalは「空間で時間を換える」方式を採用している.前者は一つの変数だけを提供して、異なるスレッドに列を作ってアクセスします.後者は各スレッドに変数を提供していますので、同時にアクセスしても互いに影響しません.
    5,単一の例がどのように複数の例のScopeをprototypeとして宣言しますか?
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    
    参考記事:https://www.jianshu.com/p/752e5b3b8b94 https://blog.csdn.net/dufufd/article/details/81736095 https://blog.csdn.net/liuchaoxuan/article/details/79338045