为了账号安全,请及时绑定邮箱和手机立即绑定

为什么锁(这){…坏?

为什么锁(这){…坏?

HUX布斯 2019-06-09 16:23:16
为什么锁(这){…坏?这个MSDN文档说public class SomeObject{   public void SomeOperation()   {     lock(this)     {       //Access instance variables     }   }}是“如果实例可以公开访问的问题”。我在想为什么?是因为锁的时间比必要的长吗?还是有更阴险的原因?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

因为如果人们可以获得您的对象实例(即:this)指针,然后它们也可以尝试锁定同一个对象。现在他们可能不知道你在锁定this在内部,因此这可能会导致问题(可能是死锁)。

除此之外,这也是不好的做法,因为它锁定了“太多”

例如,您可能有一个成员变量List<int>,唯一需要锁定的是成员变量。如果将整个对象锁定在函数中,则调用这些函数的其他东西将被阻塞,等待锁定。如果这些函数不需要访问成员列表,则会导致其他代码毫无理由地等待和减慢应用程序。


查看完整回答
反对 回复 2019-06-09
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

查看MSDN主题线程同步(C#编程指南)

通常,最好避免锁定公共类型或应用程序无法控制的对象实例。例如,如果可以公开访问实例,锁(这个)可能会有问题,因为超出您控制范围的代码也可能锁定对象。这可能会造成死锁情况,其中两个或多个线程等待同一个对象的释放。..锁定公共数据类型(而不是对象)可能会因为同样的原因而导致问题。锁定文字字符串是特别危险的,因为文字字符串是由公共语言运行库(CLR)内嵌的。这意味着对于整个程序,任何给定的字符串文本都有一个实例,在所有线程上,在所有运行的应用程序域中,完全相同的对象表示文本。因此,在应用程序进程中的任何位置放置具有相同内容的字符串的锁都会锁定应用程序中该字符串的所有实例。因此,最好锁定未被拘留的私有或受保护成员。有些类提供专门用于锁定的成员。例如,Array类型提供Syncroot。许多集合类型也提供Syncroot成员。


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信