gpt4 book ai didi

c# - 当前线程中的单例

转载 作者:太空狗 更新时间:2023-10-29 23:58:54 25 4
gpt4 key购买 nike

我的单例如下:

public class CurrentSingleton
{
private static CurrentSingleton uniqueInstance = null;
private static object syncRoot = new Object();
private CurrentSingleton() { }

public static CurrentSingleton getInstance()
{
if (uniqueInstance == null)
{
lock (syncRoot)
{
if (uniqueInstance == null)
uniqueInstance = new CurrentSingleton();
}
}
return uniqueInstance;
}
}

我想检查一下,如果我有两个线程,是否有两个不同的单例?我想,我将有两个不同的单例(具有不同的引用),所以我在做什么:

class Program
{
static void Main(string[] args)
{
int currentCounter = 0;
for (int i = 0; i < 100; i++)
{
cs1 = null;
cs2 = null;

Thread ct1 = new Thread(cfun1);
Thread ct2 = new Thread(cfun2);
ct1.Start();
ct2.Start();
if (cs1 == cs2) currentCounter++;
}
Console.WriteLine(currentCounter);
Console.Read();

}

static CurrentSingleton cs1;
static CurrentSingleton cs2;

static void cfun1()
{
cs1 = CurrentSingleton.getInstance();
}

static void cfun2()
{
cs2 = CurrentSingleton.getInstance();
}
}

我想我应该得到 currentCounter = 0(在这种情况下,每两个单例都是不同的 - 因为是由其他线程创建的)。不幸的是,我得到了例如 currentCounter = 70 所以在 70 个案例中我有相同的单例......你能告诉我为什么吗?

最佳答案

I would like check, if I will have two thread, are there two different singletons

不,没有。 static字段在整个 AppDomain 之间共享,不是每个线程。

如果你想为每个线程设置单独的值,我建议使用 ThreadLocal<T> 存储支持数据,因为这将为每线程数据提供一个很好的包装器。

此外,在 C# 中,通过 Lazy<T> 实现惰性单例通常更好。而不是通过双重检查锁定。这看起来像:

public sealed class CurrentSingleton // Seal your singletons if possible
{
private static Lazy<CurrentSingleton> uniqueInstance = new Lazy<CurrentSingleton>(() => new CurrentSingleton());
private CurrentSingleton() { }

public static CurrentSingleton Instance // use a property, since this is C#...
{
get { return uniqueInstance.Value; }
}
}

要创建一个为每个线程提供一个实例的类,您可以使用:

public sealed class InstancePerThread
{
private static ThreadLocal<InstancePerThread> instances = new ThreadLocal<InstancePerThread>(() => new InstancePerThread());

private InstancePerThread() {}
public static InstancePerThread Instance
{
get { return instances.Value; }
}
}

关于c# - 当前线程中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22719596/

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