Bezpieczeństwo wątków statycznych inicjalizatorów w języku C #
Wszyscy mówią, że statyczne inicjalizatory są bezpieczne dla wątków, ale martwię się o konkretny szczegół.
Powiedzmy, że mam
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
Która z poniższych opcji C # gwarantuje, kiedyMyStaticClass.myField
nie został jeszcze zainicjowany?
Jeśli wątki 1 i 2 próbują uzyskać dostępmyField
razem (w tej kolejności),GetNewObject
będzie miałzaczęło się wykonanie przed odczytem wątku 2myField
.
Jeśli wątki 1 i 2 próbują uzyskać dostępmyField
razem (w tej kolejności),GetNewObject
będzie miałskończone wykonanie przed odczytem wątku 2myField
.
Co z CLR w ogóle: jeśli jego gwarancje różnią się od C #, w jaki sposób się różnią?
Czy zachowanie zmieniło się w nowszych wersjach środowiska .NET?
To trudne pytanie i myślę, że pełna odpowiedź prawdopodobnie wspomniałaby o różnicy między statycznymkonstruktor i statycznyinicjatori jak z nimi współdziałająbeforefieldinit
wyprodukować żądany wynik.