我们在工作中就锁定以及究竟发生了什么进行了讨论.触发此讨论的代码是:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这是直截了当的:在缓存中查找一个值,如果它不在那里则获取一个锁,以便在代码获取名称并将其存储在缓存中时没有其他任何中断.
我们的讨论集中在(typeof(string))是否是最好的做事方式,以及究竟是做什么的.
我的问题是lock(typeof(string))究竟做了什么?它是否创建了一个用于锁定的本地字符串,或者它是否创建了具有更大范围的内容,因此可能不安全.
我的问题是lock(typeof(string))究竟做了什么?
它锁定操作符返回Type的引用所引用的对象typeof.
这意味着在同一进程(或至少相同的AppDomain)中的任何地方执行相同操作的任何代码将共享相同的锁.对我来说听起来不错.
我建议您创建一个仅用于锁定的对象:
private static readonly object CacheLock = new object();
...
lock (CacheLock)
{
...
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以轻松查看将锁定该对象的内容.
如果您锁定 a,Type则意味着您具有基于该 实例的相互访问排除Type。这意味着应用程序中执行此操作的两个线程将无意中相互阻塞或导致不可预见的死锁。
请记住,typeof(someType)仅返回一个Type实例。
通常,最佳实践是专用一个对象来锁定复杂的进程,例如readonly object在类中声明 a。如果锁只需要绕过对私有变量(例如集合)的某些访问,那么锁定该集合就很好了。
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |