El constructor estático finaliza ejecuta antes de cualquier subproceso tiene permiso para acceder a la clase.
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();
}
El código de arriba produjo los resultados a continuación.
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).
pesar de que el constructor estático tomó mucho tiempo para correr, los otros hilos se detuvo y esperó. Todos los subprocesos leen el valor de _x establecido en la parte inferior del constructor estático.
Es thread-safe. Supongamos que varios subprocesos quieren obtener la propiedad 'Instancia' de una vez. Se le pedirá a uno de los subprocesos que primero ejecute el inicializador de tipo (también conocido como el constructor estático). Mientras tanto, todos los otros hilos que quieran leer la propiedad 'Instance', serán *** bloqueados *** hasta que el inicializador de tipo haya terminado. Solo después de que el inicializador de campo haya concluido, se permitirá que los subprocesos obtengan el valor de 'Instancia'. Entonces nadie puede ver que 'Instance' sea' null'. –