Синглтон Экземпляр - PullRequest
       14

Синглтон Экземпляр

1 голос
/ 29 октября 2010

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

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

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

Ответы [ 2 ]

6 голосов
/ 29 октября 2010

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

2 голосов
/ 29 октября 2010

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

...