在C#程序中,为保证某段代码阻塞执行,如下:
func()
{
lock(this)
{
//代码1....
//代码2....
}
}
当代码中发生异常的,如:
func()
{
lock(this)
{
//代码1....
//发生异常,将直接退出函数不执行后面的代码
//代码2....
}//实际这里隐含UnLock
}
这个时候,将导致lock发生混乱,下次代码执行到该处的时候,可能与预期不同.
安全的lock用法是在lock内增加try catch,保证隐含UnLock的执行,如下:
func()
{
lock(this)
{
try
{
//代码1....
//发生异常,将直接退出函数不执行后面的代码
//代码2....
}catch
{
}
}//实际这里隐含UnLock
}
同理,其他的各种lock也应该相同处理,才能保证代码的正确执行.这个Bug非常隐秘,没有大量实际编程的程序员根本发现不了这个问题,笔者发现很多老手也没有注意出现此类错误.