您的位置:首页 > 其它

多线程学习笔记:lock

2010-01-25 18:10 316 查看
就多线程的同步问题,C#提供几个可选的方案,其中一个是lock关键字,以前在很多多线程程序中都能看到这样的代码:lock(this),今天在读《C#本质论时》,竟然发现lock(this)是多线程设计中要求避免的设计。

以下文字来源于《C#本质论》。

===========================================================================

为什么要避免在 this 和 typeof(type) 上锁定

一个常见的模式是针对类中的实例数据,在this上锁定;以及针对静态数据,在从typeof(type)获取的类型实例上锁定。这样一来,在this的情况下,可以为与一个特定对象实例关联所有状态(所有数据)提供一个同步目标;在typeof(type)的情况下,则可以为一个类型的所有静态数据提供一个同步的目标。在这样做的问题在于,在另一个完全不相关的代码块中,可能创建一个完全不同的同步块,而这个同步块的同步目标可能就是this(或typeof(type))所指向的同步目标。换言之,虽然只有实例自身内部的代码可以使用this关键字来阻止,但创建实例的调用者仍可将那个实例传给一个同步块。

结果就变成了对两套不同的数据进行同步的两个同步块可能互相阻止对方。共享同一个同步目标可能影响性能,极端的时候可能会造成死锁。所以,请不要在this或typeof(type)上锁定。更好的做法是定义一个私有的只读字段,在这个字段上,没有谁会被阻止,除了能够访问它的那个类之外。

============================================================================

光是读以上部分,根本不得要领,所以在博客园中找到一篇不错的文章,保存在这里,以备日后查看。
http://www.cnblogs.com/yuyijq/archive/2009/03/13/1410071.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: