日期:2014-05-19  浏览次数:20945 次

lock与Monitor
int   test   =   0;
                Stopwatch   sw   =   new   Stopwatch();
                sw.Start();
                for   (int   i   =   0;   i   <   10000;   ++i)
                {
                        Monitor.Enter(test);
                        try
                        {
                                test   =   i;
                        }
                        finally
                        {
                                Monitor.Exit(test);
                        }
                }
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
这段代码进行到finally里会抛出异常,而如果用lock代替Monitor来锁的话却不会有异常出现,这是什么原因呢?

------解决方案--------------------
楼主,以后先去看看MSDN

这次我帮你摘一段:

使用 Monitor 锁定对象(即引用类型)而不是值类型。将值类型变量传递给 Enter 时,它被装箱为对象。如果再次将相同的变量传递给 Enter,则它被装箱为一个单独对象,而且线程不会阻止。Monitor 本应保护的代码未受保护。此外,将变量传递给 Exit 时,也创建了另一个单独对象。因为传递给 Exit 的对象和传递给 Enter 的对象不同,Monitor 将引发 SynchronizationLockException。有关详细信息,请参见概念性主题 监视器。