스레드가 클래스에 액세스 하기 전에 정적 생성자가 실행 을 완료 합니다 .
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
가 한 번에 속성을 가져오고 싶다고 가정하십시오 . 스레드 중 하나에 먼저 유형 초기화 프로그램 (정적 생성자라고도 함)을 실행하라는 메시지가 표시됩니다. 한편Instance
속성 을 읽으려는 다른 모든 스레드 는 형식 이니셜 라이저가 완료 될 때까지 잠 깁니다 . 필드 이니셜 라이저가 완료된 후에 만 스레드가Instance
값 을 얻을 수 있습니다 . 그래서 아무도 볼 수 없습니다Instance
존재를null
.