gpt4 book ai didi

c# - 单例查找表需要锁吗?

转载 作者:太空狗 更新时间:2023-10-30 00:24:02 31 4
gpt4 key购买 nike

我下面有一个单例。我有多个线程使用查找来检查值是否有效。自从我对共享内存做任何事情以来已经有一段时间了,所以我想确定需要什么锁。我不确定是否需要并发集而不是 HashSet,因为我只插入一次值。

我在 Instance 属性上有 [MethodImpl(MethodImplOptions.Synchronized)] 因为我读到属性没有同步(有道理)。这应该可以防止创建多个实例,尽管我不确定我是否真的应该为此担心(只是重新加载集合的额外成本?)。

我应该使 FipsIsValid 函数同步,还是使用某种并发集?或者两者都不需要?

public class FipsLookup
{
private static FipsLookup instance;

private HashSet<string> fips;

private FipsLookup()
{
using (HarMoneyDB db = new HarMoneyDB())
{
instance.fips = new HashSet<string>(db.Counties.Select(c => c.FIPS).ToArray());
}
}

[MethodImpl(MethodImplOptions.Synchronized)]
public static FipsLookup Instance
{
get
{
if (instance == null)
{
instance = new FipsLookup();
}
return instance;
}
}

public static bool FipsIsValid(string fips)
{
var instance = FipsLookup.Instance;

return instance.fips.Contains(fips);
}
}

最佳答案

Should I make the FipsIsValid function Syncrhonized, or use some sort of concurrent set? Or are neither necessary?

我认为这个答案的关键是您只对 HashSet 执行查找,而不是改变它。由于它被初始化一次,而且只有一次,所以不需要同步查找。

如果您确实决定沿途需要对其进行变异,则需要使用适当的 lock 或并发集合。

附带说明一下,您可以通过在静态构造函数中初始化实例字段一次来简化单例:

private static FipsLookup instance;
static FipsLookup()
{
instance = new FipsLookup();
}

现在您可以让 Instance 返回字段,而无需使用 [MethodImpl(MethodImplOptions.Synchronized)]:

public static FipsLookup Instance
{
get
{
return instance;
}
}

关于c# - 单例查找表需要锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30670750/

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