c# – 为什么魔术锁定System.Object的一个实例不同于锁定一个特定的实例类型?

c# – 为什么魔术锁定System.Object的一个实例不同于锁定一个特定的实例类型?,第1张

概述我一直在学习锁定线程,我没有找到解释为什么创建一个典型的System.Object,锁定它,并执行任何所需的动作,在锁提供线程安全? 例 object obj = new object()lock (obj) { //code here} 起初我以为它只是被用作例子中的占位符,并且意图用你正在处理的类型进行交换.但是我发现例如Dennis Phillips点的例子,与实际使用的Object 我一直在学习锁定线程,我没有找到解释为什么创建一个典型的System.Object,锁定它,并执行任何所需的动作,在锁提供线程安全?

object obj = new object()lock (obj) {  //code here}

起初我以为它只是被用作例子中的占位符,并且意图用你正在处理的类型进行交换.但是我发现例如Dennis Phillips点的例子,与实际使用的Object实例并没有什么不同.

所以以一个需要更新一个私人字典的例子,什么是锁定System.Object的一个实例来提供线程安全性,而不是实际上锁定字典(我知道在这种情况下锁定字典可能会遇到同步问题)?
如果字典是公开的怎么办?

//what if this was public?private Dictionary<string,string> someDict = new Dictionary<string,string>();var obj = new Object();lock (obj) {  //do something with the dictionary}
解决方法 以前常用的做法是锁定共享数据本身:
private Dictionary<string,string>();lock (someDict ) {  //do something with the dictionary}

但是(有些理论上)的反对意见是,在你的控制之外的其他代码也可以锁定一些Dict,然后你可能会有一个僵局.

因此,建议使用一个(非常)私有对象,以与数据1对1的对应方式声明,用作锁的备用.只要访问字典的所有代码在obj上锁定就能保证踏板安全.

// the following 2 lines belong together!!private Dictionary<string,string>();private object obj = new Object();// multiple code segments like thislock (obj) {  //do something with the dictionary}

所以obj的目的是作为字典的代理,由于它的Type不重要,我们使用最简单的类型System.Object.

What if the dictionary was public?

那么所有的赌注都是关闭的,任何代码都可以访问Dictionary,并且包含的​​类外的代码甚至不能锁定保护对象.在开始寻找修复之前,这根本就不是可持续的模式.使用ConcurrentDictionary或保持正常的私有.

总结

以上是内存溢出为你收集整理的c# – 为什么魔术锁定System.Object的一个实例不同于锁定一个特定的实例类型?全部内容,希望文章能够帮你解决c# – 为什么魔术锁定System.Object的一个实例不同于锁定一个特定的实例类型?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1260361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存