我们在工作中就锁定以及究竟发生了什么进行了讨论.触发此讨论的代码是:
string name = (string)context.Cache[key]; if (String.IsNullOrEmpty(name)){ lock (typeof(string)){ name = (string)context.Cache[key]; //.. other code to get the name and then store in the cache } }
我认为这是直截了当的:在缓存中查找一个值,如果它不在那里则获取一个锁,以便在代码获取名称并将其存储在缓存中时没有其他任何中断.
我们的讨论集中在(typeof(string))是否是最好的做事方式,以及究竟是做什么的.
我的问题是lock(typeof(string))究竟做了什么?它是否创建了一个用于锁定的本地字符串,或者它是否创建了具有更大范围的内容,因此可能不安全.
解决方法
如果您锁定类型,则表示您基于该类型的实例具有相互访问权限排除.这意味着应用程序中的两个线程会无意中阻塞对方或导致无法预料的死锁.
请记住,typeof(someType)只返回一个Type实例.
将对象专用于锁定复杂进程通常是最佳做法,例如在类中声明只读对象.如果锁只需要访问一个私有变量,比如一个集合,那么锁定该集合就可以了.