3 使用线程
3.1 线程不同步的危害
1 竞争条件
一个线程访问某个资源后,另一个县策划那个同时使用同一个资源,产生的不良后果成为竞争条
件。
2 线程安全
形容某个方法或函数是否线程安全,指的是是否支持线程同步。
3.2 线程同步的方式
1 同步代码重要的部分
1.1 如何使用Lock
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进
入锁定的代码,则它将一直等待
(即被阻止),直到该对象被释放。
例子
private Ojbect o = new object();
lock(0)
{
//Code
}
应该避免使用lock (this)、lock (typeof (MyType)) 和 lock ("myLock");原因:防
止锁定资源被其它线程访问,
或者被其他线程释放资源。
Lock静态方法
在多线程中使用静态方法是否有线程安全问题?
这要看静态方法是是引起线程安全问题要看在静态方法中是否使用了静态成员。
多线程调用静态方法的副本,却共享静态成员。 所以,如果静态方法内无静态成员
,则不用lock。否则要lock。
详细内容可以参考这篇文章
http://blog.csdn.net/scucj/archive/2006/11/18/1394523.aspx
2 使对象不可改变
不可改变的对象是指对象一旦创建,其状态就不能修改。 设计模式中的单例模式。
3 使用线程安全包装器
设计模式中的代理模式。目的:通过代理实现同步,来调用目的对象的方法。
donet对同步的支持
参考System.Threading, System.EnterpriseService,System.Runtime.Compliler名称空
间下的信息。
3.3 .net同步策略
1 同步上下文
[SynchronizationAttribute(SynchronizationOption.Required)]
public class A:ContextBoundObject
{}
所有调用这个对象的方法的内容(Context),在同一时间只能在一个线程内执行。
2 同步代码区
使用类库
3 手控同步
使用类似系统API的方法,提供一种在不同线程和不同进程间通过代码来实现的一种
同步。
4 同步和性能
为安全,尽可能实现同步。 为性能,尽可能减少同步。
3.4 死锁
两个或多个线程正在等待对方释放自己等待访问的锁时,产生死锁。
避免死锁的方法:
1 顺序执行时,避免一次取得多种锁。
2 顺序执行时,如果不能避免1,那么多线程需要访问锁的顺序是一致的。