首页
学习
活动
专区
圈层
工具
发布

单例
EN

Stack Overflow用户
提问于 2010-10-29 09:01:21
回答 2查看 302关注 0票数 1

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

代码语言:javascript
复制
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());
    }       
}

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

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

编辑

删除静态构造函数,这会造成一些混淆。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-29 09:07:23

由于.NET中类型初始化器的性质,该代码是线程安全的。类型初始化程序保证只运行一次,如果两个线程同时运行,一个线程将运行,另一个线程将阻塞。

有关更多细节,请参见我的关于独生子女实施的文章

票数 6
EN

Stack Overflow用户

发布于 2010-10-29 09:05:09

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4050428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档