我们在工作中就锁定以及究竟发生了什么进行了讨论。触发此讨论的代码是:
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))到底是做什么的?它是否创建了一个用于锁定的本地字符串,或者它是否创建了范围更广的内容,因此可能是不安全的。
答案 0 :(得分:8)
我的问题是lock(typeof(string))究竟做了什么?
它锁定了Type
运算符返回的引用所引用的typeof
对象。
这意味着任何代码在同一进程(或至少相同的AppDomain)中的任何地方执行相同的操作将共享相同的锁。对我来说听起来不错。
我建议您创建一个 对象来锁定:
private static readonly object CacheLock = new object();
...
lock (CacheLock)
{
...
}
通过这种方式,您可以轻松查看将锁定该对象的内容。
答案 1 :(得分:2)
如果您锁定Type
,则表示您基于Type
的该实例存在相互访问权限排除。这意味着应用程序中的两个线程会无意中阻塞对方或导致无法预料的死锁。
请记住,typeof(someType)
只返回Type
个实例。
将对象专门用于锁定复杂流程(例如在类中声明readonly object
)通常是最佳做法。如果锁只需要访问一个私有变量,比如一个集合,那么锁定该集合就可以了。
答案 2 :(得分:1)
如您所链接的页面所示:
通常,避免锁定公共类型或超出代码控制范围的实例。常见的构造锁(this),lock(typeof(MyType))和lock(“myLock”)违反了这条准则:
如果lock (typeof (MyType))
可公开访问,则
MyType
会出现问题。