Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 使用锁(这个)的一个很好的理由?_C#_Multithreading_Locking - Fatal编程技术网

C# 使用锁(这个)的一个很好的理由?

C# 使用锁(这个)的一个很好的理由?,c#,multithreading,locking,C#,Multithreading,Locking,有许多帖子、投票和答案表明使用lock(这)不是一种推荐模式(更不用说是一种糟糕的模式) 例如,看一看 当我试图稍微研究一下这个模式时,我想问一下是否有人能想到一个场景,在这个场景中使用lock(this),或者甚至是必须?经验法则:永远不要锁定它,而是创建一个单独的(私有)对象来锁定 但是。。。问题更深层:锁定是有目的的,通过锁定,您可以对上层对象提供保护,但它不会阻止更新例如集合中的底层对象 在大多数情况下,不需要锁。我建议大家仔细研究一下这个问题 有多个问题,所以请回答您的问题。对于不锁定

有许多帖子、投票和答案表明使用
lock(这)
不是一种推荐模式(更不用说是一种糟糕的模式)

例如,看一看


当我试图稍微研究一下这个模式时,我想问一下是否有人能想到一个场景,在这个场景中使用
lock(this)
,或者甚至是必须

经验法则:永远不要锁定它,而是创建一个单独的(私有)对象来锁定

但是。。。问题更深层:锁定是有目的的,通过锁定,您可以对上层对象提供保护,但它不会阻止更新例如集合中的底层对象

在大多数情况下,不需要锁。我建议大家仔细研究一下这个问题

有多个问题,所以请回答您的问题。对于不锁定这一点的动机,不难建立一个观点


锁定这一点是邪恶的。这意味着可能有人决定锁定您的实例。这意味着您的实例将等待其他人发布。

根据提供的链接。。我不知道你怎么能问这个问题。该链接中的答案给出了不应锁定此的确切原因。。你还需要什么?@SimonWhitehead我不认为答案是相反的——一开始我需要,但现在不行。这不是在问“有什么问题”,而是在问“它是否对……有效”,因此我不能肯定地说“不”。虽然我还没有遇到这样的情况,但我真的想说“这取决于”。@user2864740你有没有遇到过一个原因,为什么“让你完全面对潜在的死锁”是一个好的设计决策?或者是推荐的地方?因为这就是问题所在。。而且我从来没有看到过它被推荐(不管怎样,现在..IIRC MSDN曾经说过“锁定类型”,然后改为“锁定当前实例”。.当人们意识到这实际上是在做什么时,他们决定使用私有锁对象)@SimonWhitehead如果一个特殊类型的容器需要在它所持有的一组专门对象上获得一个锁怎么办(为了论证,想象一下内部类型谁的对象没有公开)-为什么它不应该锁定这些对象?@user2864740我看不出这会改变什么。包装器仍然可以通过锁定私有锁对象来获得它所持有的集合上的锁。为什么要锁定当前实例以同步访问该实例的内部/私有属性?也许我误解了你的意思。。但我不认为这会真正改变问题。“邪恶”是一个有趣的夸张词。它也不是建设性的,暗指道德问题。给定受控源(即仅在内部使用的对象),为什么等待其他人(即受控代码)释放它是“邪恶”的?@user2864740团队中的另一位开发人员如何认为锁定实例比锁定此字段或私有字段更好(首选)如果锁来自外部“控制器”怎么办容器/对象?我是否应该创建一个非私有的
Lock
成员,以便它可以锁定每个实例?(同样,这也是代码/设计契约的目的;遵循这些契约对于独立于锁定或锁定特定实例的正确代码始终至关重要:即,我们“都知道”不要在UI线程外修改WinForm对象。)@user2864740锁定控制器中的私有字段。如果您的实例需要由外部类锁定,那么在这种情况下,类与控制器需要锁定一组包含的对象的方式有问题,因此多个集合(我们可以争论是否明确)可能会由不同的线程同时锁定。(这是一个愚蠢的例子,但我觉得我前面的观点是正确的。)谢谢你的回答,尽管我不理解“在大多数情况下锁不是必需的”这句话。关于你问题的最后一句话,我问的是完全相反的:使用锁的动机(这个),而不是不这样做的动机,关于这个,有很多帖子。除非stackoverflow社区中的每个人都认为这是错误的…更新了我的答案,并链接到一篇博客文章