单例实例

时间:2010-10-29 09:01:22

标签: c# singleton thread-safety

我知道有很多方法可以实现一个线程安全的单例模式,如(双重检查锁定,静态只读方法,锁定方法),但我只是尝试下面的代码

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

当我看到这个程序的输出时,我看到只创建了单个对象(因为相同的哈希码)

如何证明此代码不是线程安全的?

修改

删除导致一些混淆的静态构造函数

2 个答案:

答案 0 :(得分:6)

由于.NET中类型初始值设定项的性质,该代码是线程安全的。类型初始化程序保证只运行一次,如果两个线程同时尝试运行它,一个将执行此操作而另一个将阻止。

有关详细信息,请参阅我的article on singleton implementation

答案 1 :(得分:2)

这实际上是线程安全的代码,因为您(间接)使用静态构造函数来创建实例(并且CLR保证静态构造函数的调用在访问任何其他类型成员之前/之前是线程安全的方式)。