Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用lock(typeof(string))意味着什么_C# - Fatal编程技术网

C# 使用lock(typeof(string))意味着什么

C# 使用lock(typeof(string))意味着什么,c#,C#,我们在工作中讨论了锁定以及具体发生了什么。引发此讨论的代码是: string name = (string)context.Cache[key]; if (String.IsNullOrEmpty(name)){ lock (typeof(string)){ name = (string)context.Cache[key]; //.. other code to get

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

        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
实例


将对象用于锁定复杂进程通常是最佳做法,例如在类中声明
只读对象。如果锁只需要访问一个私有变量,比如说一个集合,那么锁定该集合就很好了。

如您链接到的页面所示:

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

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

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

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

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

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

private static readonly object CacheLock = new object();

...

lock (CacheLock)
{
    ...
}

这样,您就可以很容易地看到将锁定该对象的内容。

不,它锁定整个类型-。如果它只是创建了一个要锁定的随机字符串,那么其他锁如何知道要锁定该字符串的同一个实例?我建议您只创建一个伪对象来锁定,就像
private object\u lockOnThis=new object()
。我认为typeof(SomeType)总是会为同一类型返回同一类型实例。因此,您可以使用全局可用的实例作为锁,这并不是IMHO的最佳想法。@vcsjones我目前正在删除这种锁定方式的所有实例,但对它的具体作用很感兴趣。锁定专用对象的好处是什么?假设此缓存只是一个对象,它的声明方式与您的
CacheLock
@MichaelJ.Gray相同:这意味着您可以轻松检查该对象上的锁定内容。您知道.NET本身中的任何代码是否锁定在缓存上吗?我不知道。我想我对你的评论有点困惑。如何更容易检查某个东西是否锁定在
CacheLock
而不是要访问的缓存上(请注意,不是typeof(cache))?如果我有一个
锁(this.cache){..}
我相信它应该更正确。我不确定为什么这种趋势已经开始针对单个对象制作类似于
lock(this.cacheLocker){..}
的东西;我可以理解复杂进程的
cacheLocker
,其中类型是内部线程安全的,并公开公共线程安全方法。@MichaelJ.Gray:
CacheLock
是私有的。我可以很容易地看到所有可以看到它的代码。很多代码都可以访问
缓存
——任何可以使用
上下文的东西。首先,缓存
。。@MichaelJ.Gray:别忘了,如果你对资源做任何事情,也可能会锁定
。就我个人而言,我希望我们没有能力锁定任意对象……这是我们在讨论中最终得出的结论。我不确定是接受乔恩·斯基特的答案还是迈克尔的答案,因为两者都是好答案。迈克的分数少了,所以他成功了。