如何通过方法参数锁定?

时间:2011-02-10 07:55:01

标签: c# multithreading locking

string Get(string key){
   lock(_sync){
    //   DoSomething
   }
}

如果DoSomething仅依赖于密钥,我想要密钥依赖锁。我认为它可能是带有同步对象的字典。有没有完整的解决方案?

像真实的例子 What is the best way to lock cache in asp.net?

1 个答案:

答案 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可以使这更容易,而且不需要使用额外的锁。

请注意,在这个设计中没有任何东西可以清除字典...你有一套固定的密钥(在这种情况下没关系)还是可以永久增长?

您似乎已经意识到的一件事:锁定密钥本身将是一个非常糟糕的主意。等密钥可以是不同的对象,如果有任何其他代码也锁定字符串,它可能会干扰此代码。锁定字符串几乎总是错误的:)