gpt4 book ai didi

ThreadStatic 的 C# 单例模式设计

转载 作者:太空狗 更新时间:2023-10-29 22:56:56 26 4
gpt4 key购买 nike

我想了解单例模式设计。我想从我的单例类中为每个线程创建单独的实例。所以我在下面提供了两种设计。

正在运行

class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Console.ReadLine();
}
}
public sealed class SingletonClass
{
[ThreadStatic]
private static SingletonClass _instance;

public static SingletonClass Instance
{
get
{
if (_instance == null)
{
_instance = new SingletonClass();
}
return _instance;
}
}
private SingletonClass()
{

}
}

它不工作(抛出 NullReferenceException 并且没有创建实例。)

class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Task.Factory.StartNew(() => Console.WriteLine(SingletonClass.Instance.GetHashCode()));
Console.ReadLine();
}
}
public sealed class SingletonClass
{
[ThreadStatic]
private static SingletonClass _instance = new SingletonClass();

public static SingletonClass Instance
{
get
{
return _instance;
}
}
private SingletonClass()
{

}
}

我真的很奇怪为什么没有为第二个设计创建一个实例。有人可以解释一下吗?

最佳答案

而不是使用 [ThreadStatic]那么你可以使用 ThreadLocal<T>这将基本上实现你正在尝试的 [ThreadStatic] .

public sealed class SingletonClass
{
private static ThreadLocal<SingletonClass> _instance;

static SingletonClass()
{
_instance = new ThreadLocal<SingletonClass>(() => new SingletonClass());
}

public static SingletonClass Instance
{
get
{
return _instance.Value;
}
}

private SingletonClass()
{

}
}

参见:https://msdn.microsoft.com/en-us/library/dd642243(v=vs.110).aspx获取更多信息。

编辑:回答您的问题。

在 C# 中做的时候:

private static SingletonClass _instance = new SingletonClass();

不管它是否标有[ThreadStatic]或不那么它只会创建一个静态构造函数来设置 SingletonClass 的实例.

C# 无法为每个线程创建静态构造函数。

这就是你可以使用的 ThreadLocal<T>为了。如果我们以您的代码为例,那么 SingletonClass 的默认构造函数本质上变成了 "thread-static"构造函数。

关于ThreadStatic 的 C# 单例模式设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238817/

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