C# - 静态只读字符串 - 可能遇到多线程问题?

mic*_*ael 5 c# singleton static multithreading readonly

public class MyClass<T>
{
    public static readonly String MyStringValue;

    static MyClass()
    {
        MyStringValue = GenerateString();
    }

    private static String GenerateString()
    {
        //Dynamically generated ONCE per type (hence, not const)
    }

    public void Foo()
    {
        Console.WriteLine(MyStringValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,在类上调用静态构造函数之前,不会生成静态readonly String.但是,在访问其中一个静态方法或变量之前,不会调用静态构造函数.

在多线程环境中,是否可能因此而遇到问题?基本上,静态构造函数是默认单例锁定还是我自己必须这样做?那是......我必须做以下事情:

private static Object MyLock;

static MyClass()
{
    lock(MyLock)
    {
        if (MyStringValue == null)
            MyStringValue = GenerateString();
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 8

静态构造函数保证每个实例化类型只运行一次.所以你不需要锁定.

请注意,它将为每个通用参数运行一次.并且通用类上的静态字段也不在不同的泛型参数之间共享.