我有以下代码,这让我很困惑。问题是当静态字段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();
}
}
答案 0 :(得分:1)
这是否意味着类XYZ只会被实例化一次,因为当CLR初始化abc字段一次并且它是一个共享字段时。
是。只有XYZ
的一个实例,因为ABC
只有一个实例。
我会注意到,您发布的代码都没有显示任何线程不安全的代码,因此您不清楚您的问题是什么。您可能有多个线程同时执行DoSomething
。
答案 1 :(得分:0)
静态字段在第一次访问类时初始化。 见MSDN
直到类构造函数(静态)才初始化类 C#中的构造函数,Visual Basic中的Shared Sub)已完成 running.To阻止在不是的类型上执行代码 初始化后,公共语言运行库阻止来自其他语句的所有调用 线程到类的静态成员(Visual中的共享成员) 基础)直到类构造函数完成运行。