7

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

        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)) 到底是做什么的?它是创建一个用于锁定的本地字符串,还是创建具有更广泛范围的东西,因此可能不安全。

MSDN 锁定语句

4

3 回答 3

8

我的问题是 lock(typeof(string)) 到底是做什么的?

它锁定操作员返回Type的引用所引用的对象。typeof

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

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

private static readonly object CacheLock = new object();

...

lock (CacheLock)
{
    ...
}

这样你就可以很容易地看到什么会锁定在那个对象上。

于 2013-10-30T15:45:48.977 回答
2

如果您锁定 aType这将意味着您具有基于该实例的相互访问排除Type. 这意味着应用程序中的两个线程会无意中相互阻塞或导致无法预料的死锁。

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

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

于 2013-10-30T15:45:29.140 回答
1

如您链接到的页面所示:

通常,避免锁定公共类型或超出代码控制范围的实例。常见的构造 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反了此准则:

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

于 2013-10-30T15:45:46.580 回答