博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#多线程编程之:lock使用注意事项
阅读量:6979 次
发布时间:2019-06-27

本文共 1583 字,大约阅读时间需要 5 分钟。

1.避免锁定public类型对象。

  如果实例可以被公共访问,将出现lock(this)问题。

  如有一个类MyClass,该类有一个Method方法通过lock(this)来实现互斥:

1 public class MyClass
2 {
3 public void Method()
4 {
5 lock(this)
6 {
7 ......
8 }
9 }
10 }

  如果一个MyClass的实例在不同线程中执行Method方法,可以实现互斥。但如果多个MyClass的实例分别在不同的线程中执行Method方法,互斥将失效,因为此处的lock(this)仅对当前的实例对象进行了加锁。

2.禁止锁定类型

  lock(typeof(ClassName))锁定范围更为广泛,由于一个类的所有实例都只有一个类型对象(该对象是typeof的返回结果),锁定它,就锁定了该对象的所有实例。微软现在建议(原文请参考:)不要使用lock(typeof(ClassName))。以下的微软的原文描述:

  首先锁定类型对象是个很缓慢的过程,并且类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象,因此,它们就有可能代替您锁定类型对象,完全阻止您的执行,从而导致你自己的代码的挂起。

  这里的基本问题是,您并未拥有该类型对象,并且您不知道还有谁可以访问它。总的来说,依靠锁定不是由您创建、并且您不知道还有谁可以访问的对象是一种很不好的做法。这样做很容易导致死锁。

3.禁止锁定字符串

  锁住一个字符串更为神奇,只要字符串内容相同,就能引起程序挂起。

  在.NET中,字符串会被暂时存放,如果两个变量的字符串内容相同的话,.NET会把暂存的字符串对象分配给该变量。所以如果有两个地方都在使用lock("my lock")的话,它们实际锁住的是同一个对象。

如何正确使用lock呢?

  微软给出的建议是:只锁定私有对象。

  示例代码: 

1 public class MyClass
2 {
3 private static Object somePrivateStaticObject = new Object();
4
5 // methods of class go here--can lock somePrivateStaticObject
6 public void Method()
7 {
8 lock(somePrivateStaticObject)
9 {
10 ......
11 }
12 }
13 }

锁定私有对象的好处:

  首先,类以外的任何代码都无法锁定MyClass.somePrivateStaticObject,因此避免了许多死锁的可能。由于死锁属于那种最难找到根源的问题,因此,避免发生死锁的可能是一件很好的事情。

  其次,应用程序中只有一份MyClass.somePrivateStaticObject的副本,并且系统上运行的其他每个应用程序也只有一个副本。因此,在同一个应用程序域中的应用程序之间没有相互影响。

分类:
+加关注
0
0
上一篇:
下一篇:
posted @ 2017-03-18 09:05 阅读( 443) 评论( 0)
 
(评论功能已被禁用)
最新IT新闻:
·
·
·
·
·
»
最新知识库文章:
·
·
·
·
·
»
历史上的今天:
2014-03-18
2014-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18
2013-03-18

公告

 
 
 
本文转自 博客园博客,原文链接: ,如需转载请自行联系原作者
你可能感兴趣的文章
solrcloud Read and Write Side Fault Tolerance
查看>>
ADF12C 在线预览PDF文件 afinlineFrame
查看>>
python urllib2 开启调试
查看>>
总结 20 个开发细节
查看>>
面向中小企业的视频云服务 视频托管
查看>>
软件开发流程包含哪些内容
查看>>
JAVA增删改查XML文件
查看>>
JSON入门基础知识
查看>>
解决ubuntu14.04下Qt 5.3.1下的QtCreator fcitx,ibus不能输入中文
查看>>
什么是MOS ?
查看>>
linux发送email错误 501 Syntax: HELO hostname
查看>>
控制反转 IOC
查看>>
1、Linux汇编——初识汇编
查看>>
javascript json对象转字符串形式
查看>>
从12306网站谈起虚拟主机选购注意事项
查看>>
虚拟内存
查看>>
跨平台抓包软件,可以替代Fiddler
查看>>
iOS Block实现探究
查看>>
nginx虚拟目录配置
查看>>
从"Developer Removed From Sale "回到可下载状态的方法
查看>>