2009-08-24 7 views
7

インスタンス化中ではなく、シングルトンオブジェクトのインスタンス化が完了すると、2つ以上のスレッドが同じシングルトンオブジェクトにアクセスしようとするとどうなりますか?特に、シングルトンオブジェクトがリクエスト(例えば1分)を処理するのに時間がかかる場合...この場合、5つのスレッドが同じシングルトンオブジェクトにアクセスしようとすると、結果はどうなりますか?複数のスレッドがシングルトンオブジェクトにアクセスしようとした場合

その他の質問:通常、シングルトンパターンの場合はどうすればいいですか?

+1

あなたの質問に対する答えは、「本当に依存しています」です。どのようなシングルトンですか?すなわちそれは何をし、それはどうしますか?どの言語で? –

答えて

5

シングルトン内で同期(ロック)が実行されていない限り、答えはこれです。これはすべて無料です。

シングルトンは、要求時にオブジェクトのインスタンスが1つしか使用されないことを保証しますが、パターン自体は本質的にスレッドセーフな形式を提供しません。これは実装者に任されています。

(長い実行方法で)引用した特定のケースでは、クラスまたはオブジェクトレベルの変数を使用するすべてのメソッドへのアクセスを同期することが重要です。おそらくそうしなければ、競争条件につながるだろう。

幸運を祈る!

+0

もっと一般的には、シングルトンはスレッドセーフである必要があります。ロックも可能ですが、ステートレスです。 –

0

シングルトンは、1つのインスタンスだけが存在する以外の他のオブジェクトと変わらない。アクセスしようとするとどうなるのかは、アクセススレッドが何を試みているか(つまり、読み書きか)、シングルトンが保持しているデータの種類に大きく依存します。

0

あなたの質問に対する答えは、「それは本当に依存している」です。どのようなシングルトンですか?すなわちそれは何をし、それはどうしますか?どの言語で?

シングルトンパターンnは、特定のオブジェクトのインスタンスを1つしか持てないということを指示し、強制します。それ自身では、そのオブジェクトにアクセスする複数のスレッドについて何も言わない。

したがって、スレッド同期が正しく実装されていると、正しく処理されない理由はありません。たとえオブジェクトへの要求が処理に非常に時間がかかる場合でも!

2

私がシングルトンに使用する一般的なルールは、実行中のコードに影響を与えてはならず、副作用がないことです。基本的に私のプロジェクトでは、これは何らかの種類のログ機能や静的な値検索(つまり、データベースから共通のデータを一度読み込んで参照用に保存するため、必要に応じて読み込む必要はありません) 。

0

次に、シングルトンパターンのスレッドセーフ実装が必要です。

シングルトンパターンのマルチスレッドシナリオの大部分を説明している同じものに役立つthis記事を検索してください。

HTH!

+0

リンクのみの回答は推奨されませんので、SOの回答は解決策の検索の終点にする必要があります(また、時間の経過とともに古くなる傾向にある参照の途中停止)。リンクを参考にして、ここにスタンドアロンの概要を追加することを検討してください。 – kleopatra

関連する問題