gpt4 book ai didi

C# 单例线程安全

转载 作者:行者123 更新时间:2023-11-30 16:57:32 26 4
gpt4 key购买 nike

我读了 Jon Skeet 的权威 post关于如何实现 C# 单例并遵循以下模式。请注意,我没有一个空的构造函数。我的 Ctor 可能会做一些工作,例如创建和填充字符串数组(或者它可能会创建一些对象并将它们分配给私有(private)变量等):

public class MyClass
{
/// <summary>
/// Get singleton instance of this class.
/// </summary>
public static readonly MyClass Instance = new MyClass();


/// <summary>
/// a collection of strings.
/// </summary>
private string[] strings;

private MyClass()
{
this.strings = new string[]
{
"a",
"b",
"c",
"d",
"e"
};
}

public void MyMethod()
{
// tries to use this.strings.
// can a null ref exception happen here when running multithreaded code?
}
}

高于线程安全?我问是因为我在 asp.net appserver 上运行了类似的代码,并在日志中得到了 null ref 异常(不确定 null ref 是否与上述相关 - 我认为不是 - 并且日志中的调用堆栈没有帮助)。

最佳答案

老实说,我看不出为什么它不应该是线程安全的。特别是考虑到 Jon 的第四个线程安全版本本质上是相同的。

我看到的唯一问题是您没有静态构造函数。 (这可能会导致问题,请参阅 this)如果您添加静态构造函数(即使它是空的),您将拥有 Jon Skeet 所说的线程安全。

public class MyClass
{
public static readonly MyClass Instance = new MyClass();

// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static MyClass() { }
}

关于C# 单例线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26388307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com