[解決済み] スレッドセーフなC#シングルトンパターン
質問
ここに書かれているシングルトンパターンについて、いくつか質問があります。 http://msdn.microsoft.com/en-us/library/ff650316.aspx
以下のコードは、記事からの抜粋です。
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
具体的には、上記の例では、ロック前とロック後の2回、instanceとnullを比較する必要があるのでしょうか?これは必要なのでしょうか?なぜ最初にロックを実行し、比較を行わないのでしょうか?
以下のように単純化しても問題はないでしょうか?
public static Singleton Instance
{
get
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
ロックの実行は高価か?
どのように解決するのですか?
ロックの実行は
ひどく
を実行することは、単純なポインタチェックと比較した場合、非常に高価です。
instance != null
.
ここで表示されているパターンは ダブルチェックロック . その目的は、一度だけ必要になる高価なロック操作を避けることです(シングルトンが最初にアクセスされたとき)。このような実装になっているのは、シングルトンが初期化されるときに、スレッドの競合状態から生じるバグがないことも保証しなければならないからです。
このように考えてください:素の
null
チェック(
lock
は、その答えが "yes, the object is already constructed" であるときだけ、正しい使用可能な答えを与えることが保証されています。しかし、答えが "not constructed yet" ならば、本当に知りたかったのはそれが "not constructed yet であるため、十分な情報を持っていないことになります。
であり、他のスレッドではまもなく構築される予定がないことだからです。
ということです。そのため、外側チェックを非常に迅速な初期テストとして使用し、答えが「no"」である場合にのみ、適切でバグのない、しかし高価な手順 (ロックしてからチェック) を開始するのです。
上記の実装はほとんどの場合において十分なものですが、この時点で Jon SkeetのC#におけるシングルトンに関する記事 を読んでみてください。
関連
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み】C++ シングルトンデザインパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない