【问题标题】:C# - Static readonly strings -- possible to run into multithread issues?C# - 静态只读字符串 - 可能遇到多线程问题?
【发布时间】:2011-09-16 16:32:29
【问题描述】:
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);
    }
}

我的理解是,在类上调用静态构造函数之前,不会生成静态只读字符串。但是,在访问静态方法或变量之一之前,不会调用静态构造函数。

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

private static Object MyLock;

static MyClass()
{
    lock(MyLock)
    {
        if (MyStringValue == null)
            MyStringValue = GenerateString();
    }
}

【问题讨论】:

标签: c# multithreading static singleton readonly


【解决方案1】:

为避免这种情况,为什么不将值设为静态属性,只使用返回缓存值的 get 访问器,然后您可以将其设为私有?访问属性 get 将确保静态构造函数首先运行。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2011-04-20
      • 2013-01-15
      • 2020-07-26
      • 2017-09-06
      • 1970-01-01
      • 2023-03-15
      • 2013-12-27
      • 1970-01-01
      相关资源
      最近更新 更多