作者:哒Dayling玲 | 来源:互联网 | 2023-10-11 22:53
有没有理由锁定除newobject()之外的东西?objecttheLocknewobject();lock(theLock){}我总是使用一个newobject(),
有没有理由锁定除new object()之外的东西?
object theLock = new object(); ... lock (theLock) { ... }
我总是使用一个new object()
,但我想知道:在任何情况下你会锁定一个更具体的类型?
如果是new
, Type
无关紧要,实例也可以。 在这种情况下,您所说的是一个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#学习教程,希望大家多多关注—编程笔记