単一例の2つのモード
2532 ワード
1つのパターンは2つに分けられます.
1つは餓漢モード:自分で自発的にインスタンス化する.
通常、readonlyはstaticとともに使用され、その初期化は静的フィールドによって実現され、実行時にコンパイルすることができる.(静的変数は直接後から与えられ,ILにコンパイルされた後は静的構造関数でのインスタンス化と同じである.従ってstati単例(){}にも書くことができる)このモードはスレッドセキュリティの問題を自分で解決する必要はない.CLRは私たちに解決してくれます.
二つ目は怠け者モードです.
二重ロック方式を用いて,マルチスレッドでの単一モード実装をより良く解決した.内層のif文ブロックを先に見て、この文ブロックを使用する場合は、まずロック操作を行い、1つのスレッドだけが文ブロックにアクセスできることを保証し、さらに1つのインスタンスのみが作成されることを保証します.外層のif文ブロックを参照すると、各スレッドがインスタンスを取得するたびにロックをかける必要はありません.インスタンスが空の場合(インスタンスを作成する必要がある場合)だけロックをかける必要があります.インスタンスがすでに存在する場合は、インスタンスに直接戻り、パフォーマンスのオン/オフを節約します.
1つは餓漢モード:自分で自発的にインスタンス化する.
public
sealed
class
{
private
()
{
}
static
readonly
instance
=
new
();
public
static
Instance
{
get
{
return
instance;
}
}
}
通常、readonlyはstaticとともに使用され、その初期化は静的フィールドによって実現され、実行時にコンパイルすることができる.(静的変数は直接後から与えられ,ILにコンパイルされた後は静的構造関数でのインスタンス化と同じである.従ってstati単例(){}にも書くことができる)このモードはスレッドセキュリティの問題を自分で解決する必要はない.CLRは私たちに解決してくれます.
二つ目は怠け者モードです.
二重ロック方式を用いて,マルチスレッドでの単一モード実装をより良く解決した.内層のif文ブロックを先に見て、この文ブロックを使用する場合は、まずロック操作を行い、1つのスレッドだけが文ブロックにアクセスできることを保証し、さらに1つのインスタンスのみが作成されることを保証します.外層のif文ブロックを参照すると、各スレッドがインスタンスを取得するたびにロックをかける必要はありません.インスタンスが空の場合(インスタンスを作成する必要がある場合)だけロックをかける必要があります.インスタンスがすでに存在する場合は、インスタンスに直接戻り、パフォーマンスのオン/オフを節約します.
public class 1
{
static 1 instance;
static object objhelp = new object();
public static 1 Instance
{
get
{
if (instance == null)
{
lock (objhelp)
{
if(instance==null)
instance = new 1();
}
}
return instance;
}
}
}