热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:有没有理由锁定除newobject()之外的东西?分享

有没有理由锁定除newobject()之外的东西?objecttheLocknewobject();lock(theLock){}我总是使用一个newobject(),

有没有理由锁定除new object()之外的东西?
object theLock = new object(); ... lock (theLock) { ... } 

我总是使用一个new object() ,但我想知道:在任何情况下你会锁定一个更具体的类型?

如果是newType无关紧要,实例也可以。 在这种情况下,您所说的是一个synclock对象:一个用于锁定代码段以防止并发访问的对象。

对于synclock使用另一个Type不是object是浪费内存,因为您不将此实例用于其他任何事情。

在某些情况下,您可以锁定其他类型:何时需要锁定特定实例。 主要问题是:必须初始化实例才能锁定它。 在大多数情况下,您希望synclock实例的启动:)

但在某些情况下,您可以直接锁定实例; 比如字典(在这种情况下几乎直接;))。

 private Dictionary _dictiOnary= new Dictionary(); public void AddValue(string key, string value) { lock (((IDictionary)_dictionary).SyncRoot) // SyncRoot recommended { if (!_dictionary.ContainsValue(value)) _dictionary.Add(key, value); } } 

但问题是:即使这样可行,也总是问自己:“创建一个特定的锁定对象不是一个更好的主意”吗?

在我看来,任何引用类型都可以被锁定,使用虚拟对象的原因是为了避免常见的锁定陷阱:

常见的构造锁(this),lock(typeof(MyType))和lock(“myLock”)违反了这个准则:

  lock (this) is a problem if the instance can be accessed publicly. lock (typeof (MyType)) is a problem if MyType is publicly 

无障碍。

  lock("myLock") is a problem because any other code in the process 

使用相同的字符串,将共享相同的锁。

我很确定你知道那篇文章Lock Statement(C#Reference) 。

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

最佳做法是定义要锁定的私有对象,或私有静态对象变量以保护所有实例共有的数据。

上述就是C#学习教程:有没有理由锁定除new object()之外的东西?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
author-avatar
哒Dayling玲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有