lock (obj)
{
Console.WriteLine(System.DateTime.Now);
//Monitor.Exit(obj);
Thread.Sleep(3000);
Console.WriteLine(System.DateTime.Now);
}
代码如上,如果Monitor.Exit(obj);这段代码不注销的话,就会出现“从不同步的代码块中调用了对象同步方法”错误,
当前代码环境是net 3.5 sp1,此时lock相当于
Monitor.Enter(obj);
try
{
Monitor.Exit(obj);
}
finally
{
Monitor.Exit(obj);
}
测试原因就是我在try内部执行Monitor.Exit(obj);后,obj已经被释放锁了,而finally内部再次执行Monitor.Exit(obj);时,此时因为当前线程对象锁已被释放,所以就抛异常了,同理Monitor.TryEnter(obj);后不管结果为false而继续执行Monitor.Exit(obj);同样会导致“从不同步的代码块中调用了对象同步方法”错误