C#线程系列讲座(5):同步技术之Monitor2011-05-08在上一讲介绍了使用lock来实现线程之间的同步。实际上,这个lock是C#的一 个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类。先看看下 面的C#源代码:
public static void MyLock()
{
lock (typeof(Program))
{
}
}
上面的 代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示。

图1从上图被标注的区域可以看到,一条lock语句被编译成了调 用Monitor的Enter和Exit方法。Monitor在System.Threading命名空间中。lock的 功能就相当于直接调用Monitor的Entry方法,所不同的是,lock方法在结束后, 会自动解除锁定,当然,在IL中是调用了Monitor的Exit方法,但在C#程序中,看 起来是自动解锁的,这类似于C#中的using语句,可以自动释放数据库等的资源。 但如果直接在C#源程序中使用Monitor类,就必须调用Exit方法来显式地解除锁定 。如下面的代码所示:
Monitor.Entry(lockObj);
try
{
// lockObj的同布区
}
catch(Exception e)
{
// 异常处理代码
}
finally
{
Monitor.Exit(lockObj);// 解除锁定
}