Welcome

首页 / 软件开发 / C# / c#如何避免线程死锁

c#如何避免线程死锁2011-07-10大多数的死锁都是因为代码允许以不一致的方式锁定资源。例如我们要将一个账户的资金转到另一个账户中。Monitor类提供同步对对象的访问的机制。类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。示例代码如下:

public void Transer(Account accFrom, Account accTo, decimal num)
{
Monitor.Enter(accFrom);//锁定账户一
Monitor.Enter(accTo);//锁定账户二
//业务代码。。。
Monitor.Exit(accFrom);//释放账户一
Monitor.Exit(accTo);//释放账户二
}

而这个时候有两个线程,线程一和线程二试图以不同的顺序获得相同的资源,每个线程都在锁定两个资源前先行锁定了一个,此时就会出现死锁现象。

解决方法就是锁定执刑的代码。例如:

lock(this)
{
//Monitor语句
}