C#中的Lock语句实际上是对方法Monitor.Enter,Monitor.Exit和try finally语句块的语法快捷方式。
{
static readonly object _locker = new object();
static int _val1, _val2;
static void Go()
{
lock (_locker)
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
}
}
这段代码使用了Lock语句。对于Go方法真正的做的事情其实是下面的代码:
Monitor.Enter (_locker);
try
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
finally { Monitor.Exit (_locker); }
对于同一对象,调用Monitor.Exit而不调用Monitor.Enter会引发异常。
上面的代码有一点瑕疵。如果在Monitor.Enter执行的时候发生异常(尽管不太可能),此时finally方法无法执行,这时候这个锁就无法被释放了。
基于上面的缺陷,.NET 4.0 重载了Monitor.Enter方法
public static void Enter (object obj, ref bool lockTaken);
当且仅当Monitor.Enter有异常的时候,lockTaken的值会被设为False。
下面的代码是.NET 4.0中的Monitor使用的模式:(也就是Lock语句在.net 4.0中被翻译成的语句)
bool lockTaken = false;
try
{
Monitor.Enter (_locker, ref lockTaken);
// Do your stuff...
}
finally { if (lockTaken) Monitor.Exit (_locker); }
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/511224 ,如需转载请自行联系原作者