多线程学习笔记: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
以下文字来源于《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
相关文章推荐
- java学习笔记之多线程的锁接口Lock
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
- java多线程学习笔记——concurrent包的一些类(Lock 和Condition)
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- Java多线程学习笔记3——ReentranLock和ReentrantReadWriteLock
- C++ 多线程 学习笔记(二)
- Java多线程学习笔记
- 【JavaSE学习笔记】多线程02_Lock,死锁,等待唤醒机制,线程组和线程池,Timer定时器
- JAVA并发设计模式学习笔记(一)—— JAVA多线程编程
- Java学习笔记-----------套接字编程-----多线程 及控制最大连接数
- 多线程 学习笔记<1> 线程建立
- Windows API 多线程-学习笔记(一)
- 多线程学习笔记3:线程同步
- java 多线程学习笔记3-单例设计 线程间通信 互斥锁
- Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)
- JAVA并发编程学习笔记之ReentrantLock
- C#多线程学习笔记之(abort与join配合使用)
- quartz学习笔记4:lock
- [学习笔记]Java多线程经典问题
- C#笔记21:多线程之线程同步中的锁定lock、Monitor