Одиночный экземпляр

Я знаю, что есть много способов реализовать потокобезопасный одноэлементный шаблон, например (двойная блокировка проверки, статический метод только для чтения, метод блокировки), но я только что попробовал код ниже

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());
    }       
}

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

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

ИЗМЕНИТЬ

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


person TalentTuner    schedule 29.10.2010    source источник
comment
вы не выполняете параллельный доступ, поэтому проблем нет   -  person remi bourgarel    schedule 29.10.2010


Ответы (2)


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

Подробнее см. в моей статье о реализации синглтона.

person Jon Skeet    schedule 29.10.2010
comment
Спасибо, на самом деле я прочитал вашу статью на указанном ниже сайте yoda.arachsys.com/csharp/ singleton.html, но это правильный способ реализации синглтона или его можно использовать как шаблон - person TalentTuner; 29.10.2010
comment
@saurabh: Код, который вы указали, является одним из шаблонов на странице. - person Jon Skeet; 29.10.2010

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

person VinayC    schedule 29.10.2010
comment
Спасибо за ваш ответ, Винай. - person TalentTuner; 29.10.2010