我知道有很多方法可以实现一个线程安全的单例模式,如(双重检查锁定,静态只读方法,锁定方法),但我只是尝试下面的代码
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());
}
}
当我看到这个程序的输出时,我看到只创建了单个对象(因为相同的哈希码)
如何证明此代码不是线程安全的?
修改
删除导致一些混淆的静态构造函数
答案 0 :(得分:6)
由于.NET中类型初始值设定项的性质,该代码是线程安全的。类型初始化程序保证只运行一次,如果两个线程同时尝试运行它,一个将执行此操作而另一个将阻止。
有关详细信息,请参阅我的article on singleton implementation。
答案 1 :(得分:2)
这实际上是线程安全的代码,因为您(间接)使用静态构造函数来创建实例(并且CLR保证静态构造函数的调用在访问任何其他类型成员之前/之前是线程安全的方式)。