string Get(string key){
lock(_sync){
// DoSomething
}
}
如果DoSomething仅依赖于密钥,我想要密钥依赖锁。我认为它可能是带有同步对象的字典。有没有完整的解决方案?
答案 0 :(得分:21)
好吧,你可以创建一个Dictionary<string, object>
并懒洋洋地填充它以锁定对象。例如:
readonly Dictionary<string, object> dictionary = new Dictionary<string, object>();
readonly object dictionaryLock = new object();
string Get(string key) {
object bodyLock;
lock (dictionaryLock) {
if (!dictionary.TryGetValue(key, out bodyLock)) {
bodyLock = new object();
dictionary[key] = bodyLock;
}
}
lock (bodyLock) {
...
}
}
如果你需要在其他地方以相同的方式锁定,我会将“锁定查找”部分移动到辅助方法。请注意,如果您使用的是.NET 4,ConcurrentDictionary
可以使这更容易,而且不需要使用额外的锁。
请注意,在这个设计中没有任何东西可以清除字典...你有一套固定的密钥(在这种情况下没关系)还是可以永久增长?
您似乎已经意识到的一件事:锁定密钥本身将是一个非常糟糕的主意。等密钥可以是不同的对象,如果有任何其他代码也锁定字符串,它可能会干扰此代码。锁定字符串几乎总是错误的:)