【发布时间】:2010-12-21 16:25:36
【问题描述】:
我有一个静态类,它有一个私有字典。我已经编写了公共方法来添加和删除对象。现在我想确保当我从字典中删除其中一项时,没有其他人在使用它。
我怎样才能做到这一点?
【问题讨论】:
标签: c# static thread-safety
我有一个静态类,它有一个私有字典。我已经编写了公共方法来添加和删除对象。现在我想确保当我从字典中删除其中一项时,没有其他人在使用它。
我怎样才能做到这一点?
【问题讨论】:
标签: c# static thread-safety
您的意思是要确保没有其他人在使用 字典,或者没有其他人在使用 字典中的值?
您可以使用锁定来解决第一个问题……但您不能真正解决第二个问题。有人可以从字典中获取对该对象的引用,并尽可能长时间地存储该引用。如果值是接口类型,可能有一个解决方案 - 您可以通过额外的“包装器”类委托所有调用,并使该包装器类无效。如果您愿意,我可以详细介绍,但我希望您真的只对第一种安全类型感兴趣 :)
可以这样实现:
private static readonly object mutex = new object();
// Or whatever
private static readonly Dictionary<string, string> map =
new Dictionary<string, string>();
public static void AddEntry(string key, string value)
{
lock (mutex)
{
map[key] = value;
}
}
public static string GetValue(string key, string value)
{
lock (mutex)
{
return map[key];
}
}
显然你会想要调整你使用字典的方式。
如果您使用的是 .NET 4,另一种选择是使用已经是线程安全的 ConcurrentDictionary。
【讨论】:
Dictionary 中的代码是否会自行同步。原则上,我几乎总是锁定一个仅用于在我的班级中锁定的对象。这意味着我永远不必担心 other 代码也会使用该对象进行锁定。
【讨论】: