Threadsicherheit von statischen Initialisierern in C #
Jeder sagt, statische Initialisierer seien threadsicher, aber ich mache mir Sorgen um ein bestimmtes Detail.
Sagen wir, ich habe
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
Welche der folgenden Eigenschaften garantiert C #, wann?MyStaticClass.myField
ist noch nicht initialisiert?
Versuchen Sie, auf Thread 1 und 2 zuzugreifenmyField
zusammen (in dieser Reihenfolge),GetNewObject
werde habengestartet Ausführen, bevor Thread 2 liestmyField
.
Versuchen Sie, auf Thread 1 und 2 zuzugreifenmyField
zusammen (in dieser Reihenfolge),GetNewObject
werde habenfertig Ausführen, bevor Thread 2 liestmyField
.
Wie steht es mit der CLR im Allgemeinen: Wenn sich ihre Garantien von denen in C # unterscheiden, inwiefern unterscheiden sie sich?
Hat sich das Verhalten in neueren Versionen von .NET Framework geändert?
Es ist eine knifflige Frage, und ich denke, eine vollständige Antwort würde wahrscheinlich den Unterschied zwischen einer statischen Frage erwähnenKonstrukteur und eine statischeInitialisiererund wie sie interagierenbeforefieldinit
das behauptete Ergebnis zu erzeugen.