シングルトン モードは、アプリケーション ライフ サイクル全体において、常に指定されたクラスのインスタンスが 1 つだけであることを保証し、クライアント プログラムがインスタンスを取得するためのグローバル アクセス ポイントを提供します。
1. クラシック モード:
public class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
分析1)まず
第一に、クライアント プログラムがシングルトンを実現する目的を達成するために new () 操作を通じてインスタンスを生成しないようにするために、シングルトンのコンストラクターはプライベートである必要があります。2) ライフ サイクルが静的変数のライフサイクルはアプリケーション全体の静的変数とは異なります
。ライフサイクルは同じであるため、プライベート静的グローバル変数インスタンスを定義して、このクラスの唯一のインスタンスを保存できます。
3) インスタンスにアクセスするにはグローバル関数を用意する必要があり、その関数はインスタンス数を制御する機能、つまりインスタンスがインスタンス化されているかどうかをif文で判断し、インスタンス化されていない場合はインスタンスを作成する機能を提供する必要があります。 new(); それ以外の場合は、インスタンスをクライアントに直接返します。
このクラシック モードでは、スレッドのインスタンスの同時取得の問題は考慮されていません。つまり、2 つのスレッドが同時にインスタンスを取得する可能性があり、このとき null の場合、2 つのスレッドがそれぞれインスタンスを作成することになり、これは規則に違反します。シングルトンルール。したがって、上記のコードを変更する必要があります。
2. マルチスレッドでのシングルトン モード
1. レイジー モード
public class Singleton
{
private static Singleton instance;
private static object _lock=new object();
private Singleton()
{
}
public static Singleton GetInstance()
{
if(instance==null)
{
lock(_lock)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
上記のコードは、ダブル ロック メソッドを使用して、マルチスレッドでのシングルトン モードの実装をより適切に解決します。まず、内側の if ステートメント ブロックを確認します。このステートメント ブロックを使用するときは、まずロック操作を実行して 1 つのスレッドのみがステートメント ブロックにアクセスできるようにし、次にインスタンスが 1 つだけ作成されるようにします。外側の if ステートメント ブロックをもう一度見てください。これにより、各スレッドがインスタンスを取得するたびにロックする必要がなくなります。インスタンスが空の場合 (つまり、インスタンスを作成する必要がある場合) のみロックする必要があるためです。すでに存在する場合はロックを使用して作成されます。インスタンスが直接返されるため、パフォーマンスのオーバーヘッドが節約されます。
2. ハングリーマンモード
このモードは、自ら開始する例が特徴です。
public sealed class Singleton
{
private static readonly Singleton instance=new Singleton();
private Singleton()
{
}
public static Singleton GetInstance()
{
return instance;
}
}
上記で使用した readonly キーを static と組み合わせて使用すると、定数がクラス レベルであり、その初期化が静的コンストラクターによって実装され、実行時にコンパイルできることを指定できます。このモードでは、スレッド セーフティの問題を自分で解決する必要はなく、CLR が解決します。このことから、このクラスがロードされると、初めて GetInstance() を呼び出した後に唯一のシングルトン オブジェクトをインスタンス化するのではなく、このクラスが自動的にインスタンス化されることがわかります。