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);同样会导致“从不同步的代码块中调用了对象同步方法”错误
本文深入探讨了在使用.net3.5sp1环境下,`lock`语句与`Monitor`对象同步机制之间的相互作用,特别是当尝试在锁被释放后再次释放锁时所引发的“从不同步的代码块中调用了对象同步方法”的错误。通过实例分析,解释了错误产生的原因,并提供了解决方案。
2199

被折叠的 条评论
为什么被折叠?



