如何在c#

时间:2016-03-14 21:18:43

标签: c# multithreading

我有以下代码,这让我很困惑。问题是当静态字段abc将由CLR初始化时,它将有点类ABC的实例化,这将进一步实例化类XYZ。我的困惑是,在线程对类程序及其成员执行任何操作之前的多线程环境中,CLR已经初始化了字段abc,这意味着任何尝试运行DoSomething()方法的线程都必须共享abc字段(也是ABC的一个实例)。这是否意味着类XYZ只会被实例化一次,因为当CLR初始化abc字段一次并且它是一个共享字段时。

public class XYZ
{
    public XYZ(string nameOfClass)
    {
        Console.WriteLine("XYZ ctor ran");
    }
}

public class ABC
{
    private XYZ xyz = null;
    public ABC(string nameOfClass)
    {
        xyz = new XYZ(nameOfClass);
    }

    public void DoSomething()
    {
        Console.WriteLine("DoSomething Ran");
    }
}


public class SomeClass
{
   static  ABC abc = new ABC("Program");
   public  void Helper()
    {
        abc.DoSomething();
    }

}

public class Program
{

    static void Main()
    {
        SomeClass sc = new SomeClass();
        SomeClass sc2 = new SomeClass();
        for (int i = 0; i < 20; i++)
        {
            new Thread(sc.Helper).Start();
        }
        sc2.Helper();
    }
}

2 个答案:

答案 0 :(得分:1)

  

这是否意味着类XYZ只会被实例化一次,因为当CLR初始化abc字段一次并且它是一个共享字段时。

是。只有XYZ的一个实例,因为ABC只有一个实例。

我会注意到,您发布的代码都没有显示任何线程不安全的代码,因此您不清楚您的问题是什么。您可能有多个线程同时执行DoSomething

答案 1 :(得分:0)

静态字段在第一次访问类时初始化。 见MSDN

  

直到类构造函数(静态)才初始化类   C#中的构造函数,Visual Basic中的Shared Sub)已完成   running.To阻止在不是的类型上执行代码   初始化后,公共语言运行库阻止来自其他语句的所有调用   线程到类的静态成员(Visual中的共享成员)   基础)直到类构造函数完成运行。