- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我下面有一个单例。我有多个线程使用查找来检查值是否有效。自从我对共享内存做任何事情以来已经有一段时间了,所以我想确定需要什么锁。我不确定是否需要并发集而不是 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!