- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
为什么在下面的代码中使用锁是一种不好的做法,我假设这是一种基于 this SO question here 中答案的不好的做法。
private void DoSomethingUseLess()
{
List<IProduct> otherProductList = new List<IProduct>();
Parallel.ForEach(myOriginalProductList, product =>
{
//Some code here removed for brevity
//Some more code here :)
lock (otherProductList)
{
otherProductList.Add((IProduct)product.Clone());
}
});
}
关于 there 的答案提到这是不好的做法,但他们没有说明原因
注意:请忽略代码的用处,这只是为了示例目的,我知道它根本没有用
最佳答案
来自 C# 语言引用 here :
In general, avoid locking on a public type, or instances beyond your code's control. The common constructs
lock (this)
,lock (typeof (MyType))
, andlock ("myLock")
violate this guideline:
lock (this)
is a problem if the instance can be accessed publicly.
lock (typeof (MyType))
is a problem ifMyType
is publicly accessible.
lock("myLock")
is a problem because any other code in the process using the same string, will share the same lock.Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.
在您的情况下,我会阅读上述指南,认为锁定您将要修改的集合是一种不好的做法。例如,如果您编写了这段代码:
lock (otherProductList)
{
otherProductList = new List<IProduct>();
}
...那么你的锁就一文不值了。由于这些原因,建议使用专用的 object
变量进行锁定。
请注意,这并不意味着如果您使用您发布的代码,您的应用程序将中断。 “最佳实践”通常被定义为提供在技术上更具弹性的易于重复的模式。也就是说,如果您遵循最佳实践并拥有一个专用的“锁对象”,您就不太可能永远编写损坏的基于lock
的代码;如果您不遵循最佳实践,那么您可能会被一个很容易避免的问题困扰,可能是百分之一。
此外(更一般而言),使用最佳实践编写的代码通常更容易修改,因为您可以减少对意外副作用的警惕。
关于c# - 为什么锁定我们要更改的对象是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775205/
如果您想分享更多信息,可以在这里找到整个资源 指针: https://github.com/sergiotapia/DreamInCode.Net 基本上,我的API将为其他开发人员提供
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我不是 SCM 工具的经验丰富的用户,尽管我确信它们的用处,当然。 我在以前的工作中使用了一些不起眼的商业工具,在当前的工作中使用了 Perforce,并在我的小型个人项目中使用了 TortoiseS
所以我想知道一些我应该避免在 javascript 中做的事情以获得良好的 SEO 排名。在我的下一个站点中,我将广泛使用 jquery 和 javascript,但不想牺牲 SEO。那么您认为我应该
基本上,我想知道什么是避免 future CSS 代码出现问题和混淆的最佳方法... 像这样命名 CSS 属性: div#content ul#navigation div.float-left (真
我是一名优秀的程序员,十分优秀!