2010-10-29 2 views
1

Я знаю, что есть много способов реализации поточно безопасный шаблон одноэлементный как (Double Check Locking, статический чтения метод, блокировка метод), но я просто попытался ниже кодSingleton 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()); 
    }  
} 

, когда я вижу выход этой программы, я вижу только один объект, созданный (из-за того же хэш-кода)

Как доказать, что этот код не является потокобезопасным?

EDIT

удаление статического конструктора, который вызывает некоторую путаницу

+0

Вы не делаете никакого взаимного доступа, чтобы не было проблем –

ответ

6

Этот код является потокобезопасным из-за характера инициализаторов типа в .NET. Инициализатор типа гарантированно работает ровно один раз, и если два потока попытаются запустить его в одно и то же время, каждый будет делать это, а другой будет блокироваться.

Для получения более подробной информации, см. Мои article on singleton implementation.

+0

Спасибо, на самом деле я прочитал ваши статьи на сайте ниже http://www.yoda.arachsys.com/csharp/singleton.html, но это правильный способ реализовать синглтон или это можно использовать как шаблон – TalentTuner

+0

@saurabh: Код, который вы указали *, является * в основном одним из шаблонов на странице. –

2

Это фактически поточно-код, потому что вы (косвенно) с помощью статического конструктора для создания экземпляра (и CLR гарантирует вызов статического конструктора является поточно-безопасным способом включения/до доступа к любому другому типу).

+0

Спасибо за ответ youyr vinay. – TalentTuner