代码之家  ›  专栏  ›  技术社区  ›  TalentTuner

单实例

  •  1
  • TalentTuner  · 技术社区  · 14 年前

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

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

    编辑

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

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

    看我的 article on singleton implementation 更多细节。

        2
  •  2
  •   VinayC    14 年前

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