Est le C# static constructeur thread-safe?

En d'autres termes, est-ce Singleton mise en œuvre thread-safe:

public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return instance; }
    }
}
Il n'est pas thread-safe. Supposons que plusieurs threads veulent obtenir la propriété Instance à la fois. L'un des threads sera racontée à la première exécution de l'initialiseur de type (aussi connu comme le constructeur statique). Pendant ce temps tous les autres threads envie de lire la Instance de la propriété, sera verrouillé jusqu'à ce que l'initialiseur de type fini. Seulement après que le champ de l'initialiseur a conclu, sera threads être autorisés à obtenir le Instance valeur. De sorte que personne ne peut voir Instance être null.
Les autres threads ne sont pas verrouillées. De ma propre expérience, je me suis méchant erreurs à cause de cela. La garantie est que seul le poing thread va démarrer l'initialiseur statique, ou d'un constructeur, mais alors les autres threads essayez d'utiliser une méthode statique, même si le processus de construction n'a pas fini.
Cet exemple (source codé dans l'URL) ne peut pas reproduire le problème que vous décrivez. Peut-être que ça dépend de la version du CLR-vous?
Merci de prendre votre temps. Pouvez-vous s'il vous plaît expliquez-moi pourquoi ici le domaine est surchargé?
Avec ce code, dans le haut-cas X finit par être -1 même sans filetage. Ce n'est pas un thread de problème de sécurité. Au lieu de cela, l'initialiseur x = -1 s'exécute en premier (il est sur une ancienne ligne dans le code, un numéro de ligne inférieur). Puis l'initialiseur X = GetX() fonctionne, ce qui rend les majuscules X égal à -1. Et puis le "explicite" constructeur statique, l'initialiseur de type static C() { ... } pistes, qui ne varie que de bas-de-casse x. Alors, après tout cela, le Main de la méthode (ou Other méthode) peut aller sur et lire en majuscules X. Sa valeur sera -1, même avec un seul thread.

OriginalL'auteur urini | 2008-08-10