使用lock的常见错误

在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非常隐秘,没有大量实际编程的程序员根本发现不了这个问题,笔者发现很多老手也没有注意出现此类错误.

原文地址:https://www.cnblogs.com/legahero/p/1250035.html