我知道有很多方法可以实现线程安全的单例模式,比如(双重检查锁定、静态只读方法、锁方法),但是我只是尝试了下面的代码
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());
}
}当我看到这个程序的输出时,我只看到创建了一个对象(因为相同的哈希代码)。
如何证明此代码不是线程安全的?
编辑
删除静态构造函数,这会造成一些混淆。
发布于 2010-10-29 09:07:23
由于.NET中类型初始化器的性质,该代码是线程安全的。类型初始化程序保证只运行一次,如果两个线程同时运行,一个线程将运行,另一个线程将阻塞。
有关更多细节,请参见我的关于独生子女实施的文章。
发布于 2010-10-29 09:05:09
这实际上是线程安全代码,因为您正在(间接)使用静态构造函数来创建实例(并且CLR保证静态构造函数的调用是线程安全的方式,在访问任何其他类型成员时/之前)。
https://stackoverflow.com/questions/4050428
复制相似问题