使用锁(类型(字符串))的含义是什么?

本文关键字:是什么 字符串 类型 | 更新日期: 2023-09-27 18:37:25

我们在工作中讨论了锁定以及究竟发生了什么。触发此讨论的代码是:

        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))是否是最好的做事方式,以及到底是什么。

我的问题是锁(类型(字符串))到底是做什么的?它是否创建了一个用于锁的本地字符串,或者它是否创建了范围更广的东西,因此可能不安全。

MSDN 锁定语句

使用锁(类型(字符串))的含义是什么?

我的问题是锁(类型(字符串))到底是做什么的?

它锁定由typeof运算符返回的引用所引用的Type对象。

这意味着在同一进程(或至少相同的 AppDomain)内任何地方执行相同操作的任何代码都将共享相同的锁。对我来说听起来是个坏主意。

我建议您创建一个仅用于锁定的对象:

private static readonly object CacheLock = new object();
...
lock (CacheLock)
{
    ...
}

这样,您可以轻松查看将锁定该对象的内容。

如果您锁定Type则意味着您具有基于该Type实例的相互访问排除。这意味着应用程序中的两个线程执行此操作将无意中相互阻塞或导致不可预见的死锁。

请记住,typeof(someType)只返回一个Type实例。

通常,最佳做法是将

对象专用于锁定复杂进程,例如在类中声明readonly object。如果锁只需要绕过对私有变量(例如集合)的一些访问,那么锁定该集合就很好了。

如您链接到的页面上所示:

通常,请避免锁定公共类型或代码无法控制的实例。常见的构造 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反了以下准则:

如果MyType可公开访问,则lock (typeof (MyType))是一个问题。