静的コンストラクターは、スレッドがクラスにアクセスできるようになる前に実行を終了します。
private class InitializerTest
{
static private int _x;
static public string Status()
{
return "_x = " + _x;
}
static InitializerTest()
{
System.Diagnostics.Debug.WriteLine("InitializerTest() starting.");
_x = 1;
Thread.Sleep(3000);
_x = 2;
System.Diagnostics.Debug.WriteLine("InitializerTest() finished.");
}
}
private void ClassInitializerInThread()
{
System.Diagnostics.Debug.WriteLine(Thread.CurrentThread.GetHashCode() + ": ClassInitializerInThread() starting.");
string status = InitializerTest.Status();
System.Diagnostics.Debug.WriteLine(Thread.CurrentThread.GetHashCode() + ": ClassInitializerInThread() status = " + status);
}
private void classInitializerButton_Click(object sender, EventArgs e)
{
new Thread(ClassInitializerInThread).Start();
new Thread(ClassInitializerInThread).Start();
new Thread(ClassInitializerInThread).Start();
}
上記のコードは以下の結果を生成しました。
10: ClassInitializerInThread() starting.
11: ClassInitializerInThread() starting.
12: ClassInitializerInThread() starting.
InitializerTest() starting.
InitializerTest() finished.
11: ClassInitializerInThread() status = _x = 2
The thread 0x2650 has exited with code 0 (0x0).
10: ClassInitializerInThread() status = _x = 2
The thread 0x1f50 has exited with code 0 (0x0).
12: ClassInitializerInThread() status = _x = 2
The thread 0x73c has exited with code 0 (0x0).
静的コンストラクターの実行には長い時間がかかりましたが、他のスレッドは停止して待機しました。すべてのスレッドは、静的コンストラクターの下部で設定された_xの値を読み取ります。
Instance
一度にプロパティを取得したいとします。スレッドの1つは、型初期化子(静的コンストラクターとも呼ばれる)を最初に実行するように指示されます。その間、Instance
プロパティを読み取ろうとする他のすべてのスレッドは、型初期化子が完了するまでロックされます。フィールド初期化子が終了した後にのみ、スレッドはInstance
値を取得できます。だから誰も存在を見るInstance
ことができませんnull
。