Seguridad de subprocesos de inicializadores estáticos en C #
Todos dicen que los inicializadores estáticos son seguros para subprocesos, pero me preocupa un detalle en particular.
Digamos que tengo
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
¿Cuál de los siguientes garantiza C #, cuandoMyStaticClass.myField
aún no está inicializado?
Si los hilos 1 y 2 intentan accedermyField
juntos (en ese orden),GetNewObject
tendráempezado ejecutando antes del hilo 2 lecturasmyField
.
Si los hilos 1 y 2 intentan accedermyField
juntos (en ese orden),GetNewObject
tendráterminado ejecutando antes del hilo 2 lecturasmyField
.
¿Qué hay del CLR en general: si sus garantías difieren de las de C #, en qué se diferencian?
¿Ha cambiado el comportamiento en las versiones más recientes de .NET framework?
Es una pregunta difícil, y creo que una respuesta completa probablemente mencionaría la diferencia entre una estáticaconstructor y una estáticainicializador, y como interactúan conbeforefieldinit
Para producir el resultado reivindicado.