2010-10-29 16 views
1

Je sais qu'il ya beaucoup de façons de mettre en œuvre un fil modèle singleton en toute sécurité comme (verrouillage Double Check, méthode readonly statique, la méthode de verrouillage) mais j'ai juste essayé ci-dessous le codeSingleton instance

static void Main(string[] args) 
{   
    for (int i = 0; i <= 100; i++) 
    { 
     Thread t = new Thread(new ParameterizedThreadStart(doSome)); 
     t.Start(null);    
    } 
    Console.ReadLine(); 
} 

private static void doSome(object obj) 
{   
    MyReadOnly obj1 = MyReadOnly.getInstance; 
    Console.WriteLine(obj1.GetHashCode().ToString()); 
} 

class MyReadOnly 
{ 
    private static MyReadOnly instance = new MyReadOnly(); 
    int counter = 0; 

    // static MyReadOnly() 
    // { 
    // } treat is as commented code. 

    public static MyReadOnly getInstance { get { return instance; } } 
    private MyReadOnly() 
    { 
     Console.WriteLine((++counter).ToString()); 
    }  
} 

quand je vois la sortie de ce programme, je vois juste un seul objet créé (à cause du même hashcode)

comment prouver que ce code n'est pas thread-safe?

EDIT

suppression constructeur statique qui provoque une certaine confusion

+0

vous ne faites aucun accès concurente donc il n'y a pas de problème –

Répondre

6

Ce code est thread-safe en raison de la nature des initialiseurs de type dans .NET. L'initialiseur de type est garanti pour s'exécuter exactement une fois, et si deux threads essayent de l'exécuter en même temps, l'un le fera et l'autre bloquera.

Voir mes article on singleton implementation pour plus de détails.

+0

Merci, en fait, j'ai lu votre artical sur le site ci-dessous http://www.yoda.arachsys.com/csharp/singleton.html mais est-ce la bonne façon d'implémenter un singleton ou est-ce que cela peut être utilisé comme un modèle – TalentTuner

+0

@saurabh: Le code que vous avez donné * est * fondamentalement l'un des motifs de la page. –

2

ce code est en fait thread-safe parce que vous êtes (indirectement) à l'aide constructeur statique pour créer l'instance (et garantit CLR invocation de constructeur statique est de type thread-safe sur/avant l'accès à tout autre membre de type).

+0

Merci pour youryr answer vinay. – TalentTuner