string Get(string key){ lock(_sync){ // DoSomething } }
如果DoSomething仅依赖于键,我需要依赖钥匙.我认为它可能是同步对象的字典.有没有完整的解决方案?
解决方法
那么你可以创建一个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可以使这更容易,而不使用额外的锁.
请注意,在这个设计中没有什么可以清除字典…你有一套固定的键(在这种情况下还可以),还是可以永久增长?
你似乎已经意识到一件事情:锁定键本身将是一个非常糟糕的主意.等密钥可以是不同的对象,如果还有其他代码也锁定在字符串上,它可能会干扰这个代码.锁定字符串几乎总是错误的:)